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}