GNUパラレルvs&(バックグラウンドを意味する)vs xargs -P


39

.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

要するに、それらは単に構文的または実際的に異なっていますか?そして、実際に異なる場合、それぞれをいつ使用する必要がありますか?

回答:


46

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

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

単一のコンピューターで実行している場合でも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は、指定された数のジョブを並行して実行できますが、number-of-cpu-coresジョブを並行して実行することはサポートしていません。
  • xargsは出力のグループ化をサポートしていないため、出力が一緒に実行される場合があります。たとえば、行の前半はあるプロセスからのもので、行の後半は別のプロセスからのものです。
  • xargsは出力の順序を維持することをサポートしていません。したがって、xargsを使用してジョブを並行して実行する場合、2番目のジョブの出力は最初のジョブが完了するまで延期できません。
  • xargsは、リモートコンピューターでのジョブの実行をサポートしていません。
  • xargsはコンテキスト置換をサポートしていないため、引数を作成する必要があります。

1
それは良い答えです、thx。これは、私が推測したことを確認するものです。私はparallel構文を嫌い、さらにもう1つの新しいブランドのキーボードフェイスロールを記念します。しかし、コア/ジョブ間の自動バランスは価値があると思います...?
スティーブンヘンダーソン

3
見ていsemGNUパラレルパッケージの一部です。これは、構文要件により適している場合があります。
オレ丹下

1
@OleTange thx、良いコール
スティーブンヘンダーソン

> xargsはコンテキスト置換をサポートしていないため、引数を作成する必要があります。 - - これは何を意味するのでしょうか?xargsではない-I%
雨が降る

4
確かにparallelがより強力ですxargsが、その比較はかなり偏っています。たとえば、xargs空白と引用符の問題を回避するために、入力としてヌル終了文字列をサポートし、-dエミュレートすることもできますparallel(比較でも言及されています!)。xargs -Iほとんどの単純な場合に十分なコンテキスト置換であり、通常、マシン上のコアの数を知っています。グループ化されていない出力で問題が発生したことはありません。
サムブライトマン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.