假设我有两个资源,名为0
和1
,只能以独占方式访问。
是否有任何方法可以恢复启动的“并行处理器”的“索引”,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
可能无法做到这一点。是否存在最小等价解?使用/清理文件作为假锁并不可取。
答案1
如果您正在使用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
答案2
我喜欢@muru的回答,但请注意_
最后的答案非常重要!这是因为$@
仅包含$1
命令参数之后的参数和向上sh -c
(因为$0
是脚本名称)。如果没有这个,您将错过 xargs 的 n 个输入中的一个。在这里发帖是因为我被这个问题抓住了。
在其他地方,我看到提到了 GNU 并行,它可能会更容易地处理这个问题,而不会出现这样的问题。 (作为新答案发布,因为我没有评论的业力)。