假设我有两个资源,名为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可能无法做到这一点。是否存在最小等效解?使用/清理文件作为假锁是不可取的。
发布于 2018-06-12 03:07:40
如果您使用的是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发布于 2023-02-21 17:15:44
我喜欢@muru的回答,但请注意,最后的_是非常重要的!这是因为$@只包含参数$1和sh -c命令参数之后的up参数(因为$0是脚本名)。如果没有这个,那么在xargs的输入中就会丢失一个。在这里发帖是因为我被这件事抓住了。
在其他地方,我见过,它可以更容易地处理这个问题而没有这样的问题。(张贴作为一个新的答案,因为我没有因果报应)。
https://unix.stackexchange.com/questions/449224
复制相似问题