我想在GNU并行中使用--shard
标志来进行一些并发控制。
我的输入文件(input.csv
(如下所示:
node-foo,op1
node-bar,op2
node-baz,op3
node-foo,op4
node-blah,op5
...
我正在使用parallel
向节点发送操作。节点名称可能在第一列中出现多次。我想使用--shard
来确保一次最多向一个节点发送一个操作。
我的命令如下:parallel --shard 1 send_op.sh --node={1} --op={2} ::: input.csv
不幸的是,这不起作用。CCD_ 6告诉我;--shard
要求--jobs
大于参数数。增加--jobs
">
这对我来说没有意义。如果--jobs
被设置为高于输入行的数量(在我的例子中是操作的数量(,这难道不符合--shard
的点吗?如何实现所需的并发属性?
我想使用--shard来确保一次最多向一个节点发送一个操作。
--shard
不是这样做的。--shard
是--pipe
的专用版本,您没有使用管道模式。
那么你能做什么呢?
sem
确保只有具有该id的单个作业并行运行。所以你可以:
parallel --colsep , sem --id {1} send_op.sh --node={1} --op={2} :::: input.csv
此解决方案存在一些问题:
- 订单很重要。如果将所有节点A分组在一起,这些节点将并行占用作业区,从而降低处理速度。但是,如果您将
--shuf
添加到parallel
,则顺序将被打乱,因此这将是一个较小的问题 sem
的启动时间为150ms。因此,如果你的工作时间很短(<1秒的总挂钟时间(,你可能会认为这会减慢你的处理速度