GNU並列バッファstd/stderrはジョブの出力を壊したくないので知っていますが、parallel do_something ::: task_1 task_2 task_3
でジョブを実行した場合、とにかくtask_1の出力がすぐに表示され、次にtask_1が終了した後、task_2は現在の出力まで続きます。
Parallelがこの問題を解決できない場合、他に同様のプログラムで解決できるものはありますか?
バージョン20160422以降では、次のことができます。
parallel -k --lb do_something ::: task_1 task_2 task_3
parallel
は、実際に出力を順番に並べることを予約しません。通常、ジョブは十分に小さく、CPU時間で均等に分割されて順番に出てきます。多くのジョブを実行している場合や、タスクの期間が大幅に異なる場合は、さらに気づきます。
デフォルトでは、parallel
はCPUにコアがあるのと同じ量のジョブのみを実行します。ほとんどのラップトップとデスクトップでは2〜4です。つまり、一度に実行されるジョブは2、3だけです。これは-jで増やすことができます。
以下は、ジョブの順序が送信された順序で出力されないことを示す例です。
seq 20 | parallel -j 20 'sleep $[RANDOM % 20]; echo '
私のシステムの出力は(あなたのものはおそらく異なるでしょう)
7
3
13
20
8
16
2
4
18
17
1
5
9
14
12
6
10
19
11
15
seq 20
は、1〜20の数値を出力するコマンドです。私はそれを並列にパイプし、20の同時ジョブを実行して、すべてが同時に開始するように指示します。 'sleep $[\[RANDOM][1] % 20];
は、sleepと、1〜20の乱数を返すzshパラメータを使用しています。各ジョブは、このランダムな量をスリープしてからecho
をスリープします。ジョブがエコーしたら、すぐに並列から出力を取得します。
parallel --shuf
を使用して同様のことを行うこともできます ジョブの順序を入れ替える 。