如何并行运行多组命令?

如何并行运行多组命令?

我正在尝试并行运行多组命令。有10组,每组有3个命令。我希望每个组内顺序执行,并在 10 个组内并行执行。我正在尝试这样的事情,但这似乎不起作用:

(command11; command12; command13 &)
(command21; command22; command23 &)
(command31; command32; command33 &)
(command41; command42; command43 &)
...

答案1

如你所愿

差一点就撞到了正确的语法是:

(command11; command12; command13) &
(command21; command22; command23) &
(command31; command32; command33) &
(command41; command42; command43) &

如你所愿,但更好

或者,如果你想要的话在一个组内命令失败后要忽略的命令,则语法为

command11 && command12 && command13 &
command21 && command22 && command23 &
command31 && command32 && command33 &
command41 && command42 && command43 &

请注意,“ &&”与“ ”的含义截然不同&。 “ &&”表示,该命令仅在前一个命令准备好后才会运行,并且仅当执行时没有失败(即其退出代码为零)。 “ &”表示前面的命令将与主执行线并行运行,其失败或成功并不重要。

使用xargs工具

但是,这些解决方案有一个缺点,即您等不及了全部这些命令的执行。为此,我们还有一些技巧。特别是在您的情况下,执行此操作所需的命令是

for i in 1 2 3 4 5 6 7 8 9 10
do
  echo "command${i}1 && command${i}2 && command${i}3"
done | xargs -P 10 -l 1 bash -c

它使用非常有用的xargs工具。当然,您可以将任何内容通过管道传输到其中,例如,如果您想在 10 个线程中并行处理数千个事物,它就可以了。

它的工作方式是,它bash -c为所有输入行调用命令,平行线,但是,总是最多有 10 个子进程同时运行(这是由 完成的-P 10)。xargs仅当所有 bash 进程都执行完毕后,命令才会结束。

并行工具(参见其他答案)

GNU 也编写了一个parallel同样命名的工具。据我所知,它的语法比 s 更清晰一些xargs,尽管它的功能较少,而且不太常见。可能其他答案会解释它。

NodeJs“并行”模块

如果您在节点js框架中,还有一个非常常用的工具(npm install parallel),它主要用于并行化自动化构建任务,但也可以轻松地在 shellscript 中使用。

在常见环境中这不是一个好主意,因为npm包不能很好地与 Unix 数据包处理环境集成。尽管它的语法要简单得多,但其功能却远远落后于所有其他解决方案。


对于您的具体问题,我可能会在简单的情况下选择第二种解决方案,在更复杂的情况下选择基于 xargs 的解决方案。

答案2

GNU 并行这将是:

parallel 'command{}1; command{}2; command{}3' ::: {1..4}

或者如果你愿意的话命令替换

parallel 'command{}1; command{}2; command{}3' ::: $(seq 4)

GNU Parallel 有大约 150 个作业控制选项,您可能想研究它们,但从视频教程

相关内容