私が実際にやろうとしているのは、APIの競合状態をテストするために、X個のジョブを並行して実行することです。
私はこれを思いついた
echo {1..10} | xargs -n1 | parallel -m 'echo "{}"';
印刷する
7 8 9
10
4 5 6
1 2 3
しかし、私が本当に見たいのは(note順序は実際には重要ではありません)です。
1
2
3
4
5
6
7
8
9
10
そして、それらは一度に4つ並列に処理されます(または、私が持っている任意の数のCPU /コア、たとえば--jobs 4
)。合計10回の個別の実行。
私はこれを試しました
echo {1..10} | xargs -n1 | parallel --semaphore --block 3 -m 'echo -n "{} ";
しかし、一度しか印刷されないようです。ソリューションにxargsが必要ない場合のボーナスポイントは、デフォルトのレコード区切り文字が改行であるという考えをハックしたように見えますが、私も希望どおりに機能するスペースを確保できていません。
10
はかなり小さい数ですが、はるかに大きいとしましょう1000
echo {1..1000} | xargs -n1 | parallel -j1000
プリント
parallel: Warning: Only enough file handles to run 60 jobs in parallel.
parallel: Warning: Running 'parallel -j0 -N 60 --pipe parallel -j0' or
parallel: Warning: raising 'ulimit -n' or 'nofile' in /etc/security/limits.conf
parallel: Warning: or /proc/sys/fs/file-max may help.
実際には1000のプロセスは必要ありません。一度に4つのプロセスが必要です。各プロセスは1つのレコードを処理する必要があるため、完了するまでに1000回実行されます。
一度に4つのプロセスが必要です。各プロセスは1つのレコードを処理する必要があります
parallel -j4 -k --no-notice 'echo "{}"' ::: {1..10}
-j4
-ジョブスロットの数。最大4つのジョブを並行して実行
-k
-出力のシーケンスを入力の順序と同じに保ちます。通常、ジョブの出力は、ジョブが完了するとすぐに印刷されます
:::
-引数
出力:
1
2
3
4
5
6
7
8
9
10
seq 10 | parallel -j4 echo {}
または、4つのコアがある場合:
seq 10 | parallel echo