04 xxljob-任务分片


1 快速入门

1.1 API介绍

  • 在调度中心创建任务的时候,选择路由策略为:分片路由

在这里插入图片描述

  • 如何获取分片信息
ShardingUtil.ShardingVO shardingVo = ShardingUtil.getShardingVo();
// 获取当前分片
int index = shardingVo.getIndex();
// 获取总分数量
int total = shardingVo.getTotal();

1.2 演示

在快速入门程序的基础上,增加一个job演示,xxljob的分片

  1. 提供一个job
package study.wyy.job.xxl.task;

import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.IJobHandler;
import com.xxl.job.core.log.XxlJobLogger;
import com.xxl.job.core.util.ShardingUtil;

/**
 * @author wyaoyao
 * @description
 * @date 2021/1/6 13:25
 */
public class ShardDemoJob extends IJobHandler {
    @Override
    public ReturnT<String> execute(String param) throws Exception {
        ShardingUtil.ShardingVO shardingVo = ShardingUtil.getShardingVo();
        // 获取当前分片
        int index = shardingVo.getIndex();
        // 获取总分数量
        int total = shardingVo.getTotal();
        XxlJobLogger.log("current shard index is {}, total is {}",index,total);
        return ReturnT.SUCCESS;
    }
}
  1. 在执行器上注册这个job
 // 之前的注册的快速入门任务
 XxlJobExecutor.registJobHandler("demoJob",new DemoJob());
 // 注册分片任务
 XxlJobExecutor.registJobHandler("shardJob",new ShardDemoJob());
  1. 调度中心新建一个任务,注意选择分片策略为分片路由
    在这里插入图片描述
  2. 测试
  • 启动我们之前入门程序的启动类
package study.wyy.job.xxl;

import com.xxl.job.core.executor.XxlJobExecutor;
import lombok.extern.slf4j.Slf4j;
import study.wyy.job.xxl.config.XxlJobConfig;

import java.util.concurrent.TimeUnit;

/**
 * @author wyaoyao
 * @description
 * @date 2021/1/4 16:02
 */
@Slf4j
public class Client {

    public static void main(String[] args) {
        XxlJobConfig xxlJobConfig = new XxlJobConfig();
        try {
            xxlJobConfig.initXxlJobExecutor();
            while (true) {
                TimeUnit.HOURS.sleep(1);
            }
        }catch (Exception e){
            log.error(e.getMessage(),e);
        }finally {
           xxlJobConfig.destroy();
        }
    }
}

此时启动的实例执行器的端口是之前我们配置的端口是9999

// 设置执行器的端口
 xxlJobExecutor.setPort(9999);

现在修改为9998,利用idea再启动一份:
这样我们就有两个实例,执行器的端口分别是9999,9998

调度中心的执行器如果选择的是自动注册,那么就会自动发现这两个端口:
在这里插入图片描述

  • 调度中心启动任务
    观察执行日志:
 current shard index is 0, total is 2
 current shard index is 01, total is 2
### 关于 NumPy 多维数组的详细解释和用法 NumPy 的核心功能之一是对多维数组的支持,这种支持不仅体现在数据结构本身,还在于高效的数组操作以及丰富的内置函数。以下是有关 NumPy 多维数组的核心概念及其常见用法的详细介绍。 --- #### 1. **什么是 NumPy 多维数组** NumPy 提供了一种名为 `ndarray` 的对象,用于存储同类型的元素集合。这些元素可以被组织成任意维度的形式,从而形成一维、二维或多维数组[^1]。 - **特点**: 高效内存管理、矢量化运算能力、支持广播机制。 - **用途**: 科学计算、数据分析、机器学习等领域广泛使用。 --- #### 2. **创建 NumPy 多维数组** ##### 基本创建方法 可以通过多种方式创建 NumPy 数组: - 使用 `np.array()` 方法从 Python 列表或其他序列化数据转换而来。 ```python import numpy as np # 创建一维数组 arr_1d = np.array([1, 2, 3]) # 创建二维数组 arr_2d = np.array([[1, 2], [3, 4]]) # 创建三维数组 arr_3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) ``` ##### 特殊数组生成 除了手动定义外,还可以通过一些特殊函数自动生成特定模式的数组: - `np.zeros()`: 创建全零数组。 - `np.ones()`: 创建全一阵列。 - `np.empty()`: 不初始化值的数组(可能含有随机垃圾值)。 - `np.arange(start, stop, step)`: 类似 Python 的 `range()` 函数,但返回的是 NumPy 数组。 - `np.linspace(start, stop, num_points)`: 在指定范围内均匀分布一定数量的点。 示例代码如下: ```python zeros_arr = np.zeros((3, 4)) # 形状为(3, 4)的全零数组 ones_arr = np.ones((2, 2)) # 形状为(2, 2)的全一阵列 arange_arr = np.arange(0, 10, 2) # 范围内的步长数组 linspace_arr = np.linspace(0, 1, 5)# 等间距划分区间 ``` --- #### 3. **多维数组的关键属性** | 属性名 | 描述 | |------------|----------------------------------------------------------------------------------------| | `.shape` | 表示数组的形状,返回一个元组 `(dim1_size, dim2_size, ...)` | | `.dtype` | 数据类型描述符,指明数组中元素的数据类型 | | `.size` | 总共包含的元素个数 | | `.ndim` | 维度数目 | 示例演示: ```python example_array = np.random.rand(2, 3, 4) print("Shape:", example_array.shape) # 输出: Shape: (2, 3, 4) print("Data Type:", example_array.dtype) # 输出: Data Type: float64 或其他实际类型 print("Size:", example_array.size) # 输出: Size: 24 print("Dimensions:", example_array.ndim) # 输出: Dimensions: 3 ``` --- #### 4. **索引与切片** NumPy 支持类似于 Python 列表的索引和切片语法,但在多维情况下更为强大[^2]。 ##### 单元素访问 通过逗号分隔多个索引来定位单个元素的位置。 ```python arr = np.array([[1, 2, 3], [4, 5, 6]]) element = arr[1, 2] # 访问第二行第三列的元素 -> 结果为 6 ``` ##### 子数组提取 利用切片语法 `[start:end:step]` 可以轻松截取子区域。 ```python sub_array = arr[:, :2] # 截取所有行前两列 -> 结果为 [[1, 2], [4, 5]] ``` ##### 条件筛选 结合布尔掩码实现条件过滤。 ```python filtered = arr[arr > 3] # 找出大于3的所有元素 -> 结果为 [4, 5, 6] ``` --- #### 5. **高级特性:广播与转置** ##### 广播机制 即使两个数组形状不完全一致,在某些条件下仍可完成逐元素运算,这被称为广播。 ```python a = np.array([1, 2, 3]) # 形状为 (3,) b = np.array([[1], [2], [3]]) # 形状为 (3, 1) result = a + b # 自动扩展并加法 -> 结果为 [[2, 3, 4], [3, 4, 5], [4, 5, 6]] ``` ##### 转置操作 改变数组轴顺序以便重新排列数据布局。 ```python original = np.array([[1, 2], [3, 4]]) transposed = original.T # .T 是 transpose() 的快捷写法 -> 结果为 [[1, 3], [2, 4]] ``` --- #### 6. **查找与统计** 对于复杂查询需求,可通过组合逻辑表达式或专用工具完成[^3]。 - 查找满足条件的索引位置: ```python indices = np.where(vals == [1, 0]) # 寻找等于 [1, 0] 的所有坐标 ``` - 统计汇总信息: ```python mean_val = np.mean(arr) # 计算平均值 sum_val = np.sum(arr) # 求和 max_val = np.max(arr) # 最大值 min_val = np.min(arr) # 最小值 ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值