GNU 并行 vs &(我的意思是背景) vs xargs -P

Ste*_*son 47 xargs shell-script background-process gnu-parallel

我对.sh使用脚本在脚本中运行一组任务的区别或优势(如果有的话)感到困惑GNU parallel

例如Ole Tange的回答:

parallel ./pngout -s0 {} R{} ::: *.png
Run Code Online (Sandbox Code Playgroud)

而不是说通过它们循环将它们放在背景中&

例如froschutz的回答:

#copied from the link for illustration
for stuff in things
do
( something
  with
  stuff ) &
done
wait # for all the something with stuff
Run Code Online (Sandbox Code Playgroud)

简而言之,它们只是在语法上或实际上不同吗?如果实际上不同,我应该什么时候使用它们?

ter*_*don 56

将多个作业置于后台是使用单机多核的好方法。parallel但是,允许您将作业分布在网络的多个服务器上。来自man parallel

GNU parallel 是一种 shell 工具,用于使用一台或多台计算机并行执行作业 。典型的输入是文件列表、主机列表、用户列表、URL 列表或表列表。

即使在单台计算机上运行,parallel您也可以更好地控制作业的并行化方式。从man页面中获取此示例:

   To convert *.wav to *.mp3 using LAME running one process per CPU core
   run:

   parallel lame {} -o {.}.mp3 ::: *.wav
Run Code Online (Sandbox Code Playgroud)

好的,你也可以这样做

   for i in *wav; do lame "$i" -o "${i%.wav}.mp3" & done
Run Code Online (Sandbox Code Playgroud)

但是,这会更长更麻烦,更重要的是,将启动与.wav文件数量一样多的作业。如果你在几千个文件上运行它,它很可能会让一台普通的笔记本电脑屈服。parallel另一方面,将为每个 CPU 内核启动一个作业并保持一切整洁。

基本上,parallel您可以微调作业的运行方式以及它们应该使用多少可用资源。如果您真的想了解此工具的强大功能,请阅读它的手册,或者至少阅读它提供的示例。

与并行相比,简单的背景确实远不及复杂程度。至于有什么parallel不同xargs,GNU 人群在这里给出了一个很好的分类。一些更突出的点是:

  • xargs 处理特殊字符(例如空格、' 和 ")的效果很差。
  • xargs 可以并行运行给定数量的作业,但不支持并行运行 CPU 核心数的作业。
  • xargs 不支持对输出进行分组,因此输出可能会一起运行,例如,一行的前半部分来自一个进程,而该行的后半部分来自另一个进程。
  • xargs 不支持保持输出顺序,因此如果使用 xargs 并行运行作业,则第二个作业的输出不能推迟到第一个作业完成。
  • xargs 不支持在远程计算机上运行作业。
  • xargs 不支持上下文替换,因此您必须创建参数。

  • `parallel` 确实比 `xargs` 更强大,但这种比较是有偏见的。例如,`xargs` 支持以空字符结尾的字符串作为输入,以避免出现空格和引号的问题,还可以通过 `-d` 模拟 `parallel`(甚至在比较中提到!)。`xargs -I` 对大多数简单的情况来说是足够的上下文替换,我通常知道机器上的核心数。我从未遇到过未分组输出的问题。 (7认同)
  • 看看 `sem`,它是 GNU Parallel 包的一部分。这可能更适合您的语法要求。 (3认同)