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


39

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

例如,Ole Tange的答案:

parallel ./pngout -s0 {} R{} ::: *.png

而不是说遍历它们将它们置于背景中&

例如弗罗斯特斯的答案:

#copied from the link for illustration
for stuff in things
do
( something
  with
  stuff ) &
done
wait # for all the something with stuff

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

Answers:


46

将多个作业放在后台是使用一台计算机的多个内核的好方法。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

好,你可以用

   for i in *wav; do lame "$i" -o "${i%.wav}.mp3" & done

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

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

简单的背景技术确实比并行技术更复杂。至于有什么parallel不同xargs,GNU人群在这里给出了很好的细分。一些比较明显的要点是:

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

1
好的,谢谢。它肯定了我的猜测。我不喜欢这种parallel语法,但它却成为了另一种崭新的键盘表情符号。但是我想核心/职位之间的自动平衡是值得的...?
斯蒂芬·亨德森

3
看看sem哪个是GNU Parallel软件包的一部分。那可能更适合您的语法要求。
Ole Tange 2013年

1
@OleTange thx,好电话
Stephen Henderson

> xargs不支持上下文替换,因此您必须创建参数。 - - 这是什么意思?xargs -I%
Raine '16

4
的确parallel比强大得多xargs,但是这种比较存在偏颇。例如,xargs支持以空值终止的字符串作为输入,以避免出现空格和引号问题,并且还可以-d进行仿真parallel(甚至在比较中提到!)。xargs -I对于大多数简单情况而言,足以替代上下文,并且我通常知道计算机上的内核数量。我从未遇到未分组输出的问题。
山姆·布莱曼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.