n個のステートメントs1、s2、s3、...、snを考えてみましょう。各ステートメントには無限の実行ステップがあり、すべてのステートメントを並列に実行したいと思います。
私のシェルスクリプトは次のとおりです。
s1
s2
s3
.
.
.
sn
インターリーブが発生するようにコードをどのように変更しますか?
答え1
各ステートメントをバックグラウンドで実行するように要求すると、目的の結果が得られるように聞こえます。
s1 &
s2 &
...
sn &
wait
(このwait
コマンドを使用すると、すべてのバックグラウンドジョブが完了するまでスクリプトがフォアグラウンドで実行されます。)
より多くの制御が必要な場合は、GNU並列処理を使用することをお勧めします。
答え2
GNU Parallelはこのために誕生しました:
cat file_with_commands | parallel
デフォルトでは、各CPUコアは1つのジョブを実行します。コア以上にしたい場合:
parallel -j200 < file_with_commands
コマンドが非常に似ている場合:
parallel s{} ::: {1..100}
並列に実行されますs1
....s2
s100
GNU Parallelは、同じコンピュータまたはSSHを介してアクセスできる複数のコンピュータでタスクを並列に簡単に実行できる汎用の並列ハンドラです。
4つのCPUで32の異なるジョブを実行する場合は、並列化する簡単な方法は、各CPUで8つのジョブを実行することです。
代わりに、GNU Parallel はタスクが完了すると新しいプロセスを作成し、CPU をアクティブに保つことで時間を節約します。
インストールする
セキュリティ上の理由から、パッケージマネージャを使用してGNU Parallelをインストールする必要がありますが、GNU Parallelが展開用にパッケージ化されていない場合は、rootアクセスを必要としないプライベートインストールを実行できます。これは10秒で完了できます。
(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
その他のインストールオプションについては、以下を参照してください。http://git.savannah.gnu.org/cgit/parallel.git/tree/README
詳細
より多くの例を見る:http://www.gnu.org/software/parallel/man.html
紹介ビデオを見る:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
このチュートリアルを見てください。http://www.gnu.org/software/parallel/parallel_tutorial.html
サポートを受けるには、メールリストに参加してください。https://lists.gnu.org/mailman/listinfo/parallel