GNU Parallel中--shard参数使用报错及节点并发控制实现问题
报错逻辑解释
你当前的写法存在两个核心问题,既触发报错也不符合预期需求:
- 你使用
::: input.csv传参时,GNU Parallel会将input.csv这个字符串本身作为唯一的输入参数,而非读取input.csv文件的每一行作为输入,此时输入参数总数仅为1。--shard N的作用是将所有输入参数均匀分配给--jobs指定的N个worker进程,要求shard序号不超过--jobs数值,同时--jobs必须大于输入参数总数才能让shard分配规则生效,这就是报错的直接原因。 - 就算你调整
--jobs参数消除报错,--shard本身也不支持「按节点名分组限制并发」的需求,它仅会按输入顺序拆分任务块,完全不识别第一列的节点名取值。
正确实现方案
你需要的「同一节点同一时间最多运行1个任务,不同节点任务可并行」的需求,直接使用GNU Parallel原生的--group-by参数即可实现,正确命令如下:
parallel --colsep ',' --group-by 1 send_op.sh --node={1} --op={2} :::: input.csv
各参数作用说明:
--colsep ',':指定逗号为列分隔符,将每行内容拆分为多列,第一列对应占位符{1},第二列对应{2}--group-by 1:按第一列的取值分组,同一分组内的任务串行执行,不同分组的任务可并行,天然满足同节点并发数限制要求:::: input.csv:读取input.csv的每一行作为输入参数,而非将文件名本身作为参数
如果你的CSV文件包含表头需要跳过,在命令中额外添加-H参数即可。
内容的提问来源于stack exchange,提问作者Apoorva Bhagwat
相关产品推荐
相关产品推荐

