web-dev-qa-db-ja.com

GNU並列vs&(つまり背景を意味します)vs xargs -P

.shを使用してGNU parallelスクリプトで一連のタスクを実行することの違いまたは利点(ある場合)について混乱しています

例えば。 Ole Tange の答え:

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

要するに、それらは構文的または実際的に異なるのですか?そして、実際に異なる場合、それぞれをいつ使用すればよいですか?

41

複数のジョブをバックグラウンドで配置することは、単一のマシンの複数のコアを使用する良い方法です。ただし、parallelを使用すると、ネットワークの複数のサーバーにジョブを分散できます。 man parallelから:

GNUパラレルは、1つまたは複数のコンピューターを使用してジョブを並列に実行するためのシェルツールです。典型的な入力は、ファイルのリスト、ホストのリスト、ユーザーのリスト、URLのリスト、またはテーブルのリストです。

単一のコンピューターで実行している場合でも、parallelを使用すると、ジョブの並列化方法をはるかに制御できます。 manpageから次の例を見てください。

   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を使用すると、ジョブの実行方法と使用可能なリソースの使用量を微調整できます。このツールの機能を実際に確認したい場合は、その manual 、または少なくとも、このツールが提供する例を確認してください。

単純なバックグラウンド処理は、並列処理と比較するための高度なレベルに本当に近いところはありません。 parallelxargsとどのように異なるかについては、GNU群衆がナイスな内訳を与える here 。より顕著なポイントのいくつかは:

  • xargsは、特殊文字(スペース、 '、 "など)を適切に処理しません。
  • xargsは、指定された数のジョブを並行して実行できますが、number-of-cpu-coresジョブを並行して実行することはできません。
  • xargsは出力のグループ化をサポートしていないため、出力が一緒に実行される場合があります。行の前半はあるプロセスからのものであり、行の後半は別のプロセスからのものです。
  • xargsは出力の順序を維持することをサポートしていないため、xargsを使用してジョブを並行して実行している場合、2番目のジョブの出力は最初のジョブが完了するまで延期できません。
  • xargsは、リモートコンピューターでのジョブの実行をサポートしていません。
  • xargsはコンテキスト置換をサポートしていないため、引数を作成する必要があります。
49
terdon