GNUパラレル:ジョブの順序に応じてstderr / stdoutジョブを一度に1つずつすぐに表示します。

GNUパラレル:ジョブの順序に応じてstderr / stdoutジョブを一度に1つずつすぐに表示します。

ジョブ出力が破損したくないので、GNUパラレルバッファstd / stderrを知っていますが、次のようにジョブをparallel do_something ::: task_1 task_2 task_3実行すると

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

答え1

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

parallel -k --lb do_something ::: task_1 task_2 task_3

答え2

parallel実際に出力を順次作成するには何の制限もありません。偶然にも、タスクは通常十分に短く、CPU時間は順番に発生するように均等に分配されます。多数のジョブを実行した場合、またはそのジョブの期間が大幅に異なる場合は、この事実をよりよく知ることができます。

デフォルトでは、parallelCPUコアの数だけジョブが実行されます。ほとんどのノートパソコンとデスクトップでは、この数字は2〜4です。これは一度にいくつかのタスクしか実行しないことを意味します。 -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とzshパラメータを一緒に使用すると、1から20までの乱数が返されます。各ジョブは対応するノンスからスリープモードに切り替わり、ジョブがエコーされるとecho出力が並列になります。

また、次のparallel --shufことができます作業順序の中断

関連情報