GNU Parallel:スレッドID
Sep 11 2020
GNU Parallelでは、-jオプションを使用して、同時ジョブの数を指定できます。
ジョブを実行しているスレッドのIDを取得することは可能ですか?スレッドIDとは、12スレッドのマシンで1から12までの数字を意味します。現在のところ、次の回避策を使用しています。
doit() {
let var=$1*12+$2
echo $var $2
}
export -f doit
for ((i=0;i<2;++i))
do
parallel -j12 doit ::: $i ::: {1..12}
done
これには、ループのすべての反復が12スレッドすべての終了を待機するという問題があります。同じスレッドIDで同時に反復を実行しないことにのみ関心があります。
これに対する私の動機は、すべてのスレッドが12個のファイルの1つで書き込みロックを使用することです。正確に12個のファイルを取得しましたが、1つのファイルのスレッドが終了すると、次のスレッドはすぐにこのファイルを再び使用できます。
回答
OleTange Sep 14 2020 at 16:25
@MarkSetchellが書いているように、ジョブスロット番号を与える置換文字列{%}を使用する必要があります。
parallel --line-buffer -j12 'echo starting job {#} on {%}; sleep {=$_=rand()*30=}; echo finishing job {#} on {%}' ::: {1..50}