Shell-Script

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

  • August 10, 2018

我對.sh使用在腳本中執行一組任務的區別或優勢(如果有的話)感到困惑GNU parallel

例如Ole Tange的回答:

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

而不是說循環通過它們把它們放在後台&

例如antifreeze的回答:

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

簡而言之,它們只是在語法上或實際上不同嗎?如果實際上不同,我應該什麼時候使用它們?

將多個作業放在後台是使用單台機器的多個核心的好方法。parallel但是,它允許您將作業分佈在網路的多個伺服器上。來自man parallel

GNU 並行是一種外殼工具,用於使用一台 或多台電腦並行執行作業。典型的輸入是文件列表、主機列表、使用者列表、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不同,GNU 人群在這裡xargs給出了很好的細分。一些比較突出的點是:

  • xargs 不能很好地處理特殊字元(例如空格、’ 和 “)。
  • xargs 可以並行執行給定數量的作業,但不支持並行執行 number-of-cpu-cores 作業。
  • xargs 不支持對輸出進行分組,因此輸出可能會一起執行,例如,一行的前半部分來自一個程序,而後半部分來自另一個程序。
  • xargs 不支持保持輸出的順序,因此如果使用 xargs 並行執行作業,則第二個作業的輸出不能推遲到第一個作業完成。
  • xargs 不支持在遠端電腦上執行作業。
  • xargs 不支持上下文替換,因此您必須創建參數。

引用自:https://unix.stackexchange.com/questions/104778