web-dev-qa-db-ja.com

GNU Parallel:ジョブの順序でジョブstderr / stdoutを一度に1つずつすぐに表示します

GNU並列バッファstd/stderrはジョブの出力を壊したくないので知っていますが、parallel do_something ::: task_1 task_2 task_3でジョブを実行した場合、とにかくtask_1の出力がすぐに表示され、次にtask_1が終了した後、task_2は現在の出力まで続きます。

Parallelがこの問題を解決できない場合、他に同様のプログラムで解決できるものはありますか?

8
Hai Luong Dong

バージョン20160422以降では、次のことができます。

parallel -k --lb do_something ::: task_1 task_2 task_3
12
Ole Tange

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を使用して同様のことを行うこともできます ジョブの順序を入れ替える

2
Rothgar