.sh
で一連のタスクを実行することの違いや利点(ある場合)について混乱しています。 GNU parallel
を使用したスクリプト
例えば。オーレ・タンゲの答え:
parallel ./pngout -s0 {} R{} ::: *.png
それらをループしてバックグラウンドに置くのではなく、&
。
例えば。 frostschutzの答え:
#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 parallelは、
1台以上のコンピューターを使用してジョブを並列に実行するためのシェルツールです。 。一般的な入力は、
ファイルのリスト、ホストのリストです。 、ユーザーのリスト、URLのリスト、またはテーブルのリスト。
1台のコンピューターで実行している場合でも、parallel
ジョブの並列化方法をはるかに細かく制御できます。 man
からこの例を見てください ページ:
To convert *.wav to *.mp3 using LAME running one process per CPU core
run:
parallel lame {} -o {.}.mp3 ::: *.wav
OK、あなたは
で同じことをすることができます for i in *wav; do lame "$i" -o "${i%.wav}.mp3" & done
ただし、これは長くて面倒であり、さらに重要なことに、.wav
と同じ数のジョブを起動します。 ファイル。これを数千のファイルで実行すると、通常のラップトップがひざまずく可能性があります。 parallel
一方、CPUコアごとに1つのジョブを起動し、すべてを適切に整理します。
基本的に、parallel
ジョブの実行方法と、ジョブが使用する必要のある利用可能なリソースの量を微調整する機能を提供します。このツールの威力を本当に知りたい場合は、そのマニュアル、または少なくとも、このツールが提供する例を確認してください。
単純な背景には、並列と比較できる洗練されたレベルにはほど遠いものがあります。どのようにparallel
xargs
とは異なります 、GNUの群衆はここで素晴らしい内訳を示します。より顕著なポイントのいくつかは次のとおりです。
- xargsは、特殊文字(スペース、‘、“など)を適切に処理しません。
- xargsは、指定された数のジョブを並行して実行できますが、CPUコア数のジョブを並行して実行することはサポートされていません。
- xargsは出力のグループ化をサポートしていないため、出力は一緒に実行される可能性があります。行の前半は1つのプロセスからのものであり、行の後半は別のプロセスからのものです。
- xargsは出力の順序を維持することをサポートしていないため、xargsを使用してジョブを並行して実行する場合、最初のジョブが完了するまで2番目のジョブの出力を延期することはできません。
- xargsは、リモートコンピューターでのジョブの実行をサポートしていません。
- xargsはコンテキスト置換をサポートしていないため、引数を作成する必要があります。