【问题标题】:Limit total number of jobs within nested or concurrent GNU Parallel invocations限制嵌套或并发 GNU 并行调用中的作业总数
【发布时间】:2020-07-05 20:41:28
【问题描述】:

这是嵌套 GNU Parallel 上 this questionthis question 的延续。最终我想要实现的是保持我的 Makefile 不变,除非更改 SHELL= 变量并使用 parallel 在我的所有机器上分配作业。

有没有办法确保 GNU Parallel 的并发执行遵守外部调用中指定的 --jobs 子句?或者其他方式来限制并行调用的作业总数?例如:我希望下面输出中的内槽始终为1,即输出第三行的slot 1-2 违反了条件。

~• inner_par="parallel -I // --slotreplace '/%/' --seqreplace '/#/'"
~• cmd='echo id {#}-/#/, slot {%}-/%/, arg {}-//'
~• seq 2 | parallel -j 1 "seq {} | $inner_par $cmd"
id 1-1, slot 1-1, arg 1-1
id 2-1, slot 1-1, arg 2-1
id 2-2, slot 1-2, arg 2-2
~• 

【问题讨论】:

    标签: gnu-parallel


    【解决方案1】:

    你在找sem吗?

    parallel -j 10 parallel -j 20 sem -j 30 --id myid mycmd
    

    这将启动 200 个sems,但仅并行运行 30 个mycmds。

    【讨论】:

    • 是的,奥莱! Sem 很有帮助。但不幸的是,它在完成后删除了信号量。我想要一个指向信号量文件的选项,以便它可以在不同用户之间共享。这可能/实用吗?
    • 嗯...不。目前这是不可能的。信号量仅限于单个用户。
    • 实现我想要的另一种方法是按照文档中的“简单队列”示例启动 Parallel。问题在于捕获正确作业的退出代码并使SHELL= 包装器等待该特定作业完成。我正在考虑使用wc 来获取工作ID,但这又需要一个共享信号量。此外,当作业失败并重新启动时,它是否保持相同的 JobId?
    • 这可能行得通。但是使用PARALLEL_SHELL= 而不是SHELL=。 JobID 保持不变。
    猜你喜欢
    • 2018-06-09
    • 2021-10-15
    • 2014-06-27
    • 2014-01-10
    • 1970-01-01
    • 2018-05-03
    • 2010-12-05
    • 1970-01-01
    • 2017-05-27
    相关资源
    最近更新 更多