【问题标题】:GNU Parallel: how to prevent specific jobs from being processed in parallelGNU Parallel:如何防止特定作业被并行处理
【发布时间】:2019-04-30 10:35:35
【问题描述】:

给定:

一组要并行运行的作业:{ app0, app1, app2, .... }

问题:

如何启动“GNU 并行”工具以并行运行所有作业,从而阻止某些特定作业同时运行?

示例:

如果appX 和appY 依赖于相同的资源,如何指定appX 可以与app0、app1 并行运行,...但不能与appY 并行运行?

示例 2:

appX 和appY 可以并行运行,但它们都不能与appZ 并行运行。

【问题讨论】:

  • 如果规则不是太复杂,把appX和appY从列表中去掉,换成appZ = { appX ; appY; }
  • 不是 GNU 并行的解决方案,但有点相关且读起来很有趣:Bash complex pipeline dependencies
  • 如果 Mark Setchell 的解决方案不是一个选项,因为您想要允许 appX; ...; appY 和 appY; ...; appX 的非确定性行为,那么您可以在 appX 和 appY 中使用锁定机制,请参阅ensure only one instance of a shell script is running at a time.
  • @MarkSetchell:我喜欢你的解决方案的优雅。您能否将此作为答案,以便我将其标记为回复?但是,您的解决方案在时间排序方面似乎有点干扰。 GNU 并行无法选择运行 appX 等待一段时间然后运行 ​​appY。
  • 让我们等到 GNU Parallel 的作者 Ole Tange 登录。他总是有很好的想法将parallel 应用于问题。

标签: bash parallel-processing gnu-parallel


【解决方案1】:

我不是 100% 清楚你想要什么。也许将 appX 和 appY 替换为:

sem --id myidXY --fg appX
sem --id myidXY --fg appY

可以这样做:

... | parallel eval '{= s/(app(X|Y))/sem --id appXY --fg $1/ =}'

这应该确保只有一个appX 或appY 正在运行;但让大量appZs 运行。

{= =} 被解释为 Perl 代码。

s/(app(X|Y))/sem --id appXY --fg $1/ 将appX 或appY 替换为sem --id appXY --fg,后跟appX 或appY,具体取决于匹配的内容。如果没有匹配,则值不变。

(echo appX; echo appX; echo appX; 
 echo appY; echo appX; echo appV;
 echo appX; echo appZ) |
  parallel eval '{= s/(app(X|Y))/sem --id appXY $1/ =}'

如果这不是你的意思,请编辑问题。

【讨论】:

  • 是的,信号量似乎是解决方案。请您详细说明 '{= ... =}' 构造吗?如果还有另外三个应用程序 A、B 和 C,那么完整的命令行会是什么样子?
  • 不错的解决方案!快速的问题,如果 appX 正在运行,它会启动 appY,这将阻塞并因此占用一个工作槽,直到 appX 完成 - 不是吗?
  • 是的,存在这样的风险,即除了一个工作槽之外的所有工作槽都在等待那个。
猜你喜欢
  • 2019-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多