首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获得xargs“并行处理器”的索引?

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

Unix & Linux用户
提问于 2018-06-12 02:57:00
回答 2查看 3.7K关注 0票数 17

假设我有两个资源,名为01,它们只能被独占访问。

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

代码语言:javascript
复制
$ 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,在那里输出看起来像

代码语言:javascript
复制
$ 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可能无法做到这一点。是否存在最小等效解?使用/清理文件作为假锁是不可取的。

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2018-06-12 03:07:40

如果您使用的是GNU xargs,那么就有--process-slot-var

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

因此,例如:

代码语言:javascript
复制
~ 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
票数 23
EN

Unix & Linux用户

发布于 2023-02-21 17:15:44

我喜欢@muru的回答,但请注意,最后的_是非常重要的!这是因为$@只包含参数$1sh -c命令参数之后的up参数(因为$0是脚本名)。如果没有这个,那么在xargs的输入中就会丢失一个。在这里发帖是因为我被这件事抓住了。

在其他地方,我见过,它可以更容易地处理这个问题而没有这样的问题。(张贴作为一个新的答案,因为我没有因果报应)。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/449224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档