如何获得xargs“并行处理器”的索引?


14

假设我有两个资源,分别名为01,只能以独占方式访问。

有什么方法可以恢复xargs启动的“并行处理器”的“索引”,以便将其用作免费的互斥服务?例如,考虑以下并行计算:

$ echo {1..8} | xargs -d " " -P 2 -I {} echo "consuming task {}"
consuming task 1
consuming task 2
consuming task 3
consuming task 4
consuming task 5
consuming task 6
consuming task 7
consuming task 8

我的问题是,是否存在一个神奇的词,例如index,输出看起来像

$ echo {1..8} | xargs -d " " -P 2 -I {} echo "consuming task {} with resource index"
consuming task 1 with resource 0
consuming task 2 with resource 1
consuming task 3 with resource 1
consuming task 4 with resource 1
consuming task 5 with resource 0
consuming task 6 with resource 1
consuming task 7 with resource 0
consuming task 8 with resource 0

唯一的保证是最多只有一个使用资源的进程0和相同的进程1。基本上,我想将此索引传达给子进程,该子进程将遵守规则以仅使用被告知的资源。

当然,最好将其扩展到两个以上的资源。检查文档,xargs可能无法执行此操作。有最小的等效解决方案吗?使用/清除文件作为伪锁不是可取的。

Answers:


19

如果您使用的是GNU xargs,则有--process-slot-var

--process-slot-var= 环境变量名称在每个正在运行的子进程中,
将环境变量环境变量名称设置为唯一值。每个值都是一个十进制整数。一旦子进程退出,值将被重用。例如,这可以用于基本的负载分配方案。

因此,例如:

~ echo {1..9} | xargs -n2 -P2 --process-slot-var=index sh -c 'echo "$index" "$@" "$$"' _
0 1 2 10475
1 3 4 10476
1 5 6 10477
0 7 8 10478
1 9 10479
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.