Shell-Script
GNU 並行 vs &(我的意思是背景) vs xargs -P
我對
.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 不支持上下文替換,因此您必須創建參數。