.NETのParallel.For的な処理をbashで
はじめに
「.NETやopenMPのparallel for的な処理をbashでやりたい」という状況が生じたのでメモ.
方法を簡単に言うと,xargsにseqでループカウンタを渡して,各処理をパラレルに処理する.
※xargsによる並列処理については以前に書いた*1.
やりかた
$ seq [カウンタ開始値] [カウンタ終了値] | xargs -P[並列数] -Ix bash -c '[具体的な処理]'
seqでループカウンタを生成して*2,それをxargsに渡して処理する.
ただし,各処理におけるループカウンタ値はxで参照する*3.
これは,C#(.NET)における次のようなコードと対応する.
Parallel.For([カウンタ開始値], [カウンタ終了値], new ParallelOptions() {MaxDegreeOfParallelism = [並列数]}, x => [具体的な処理])
具体例
$ seq 1 10 | xargs -P8 -Ix bash -c 'echo x'
実行結果は次のようになる.
3 1 2 4 5 6 7 8 9 10
ただし,結果の出力順序は毎回変化する.
これは,xargsにおける並列処理の終了順序に依存するためである.