Równoległy GNU: identyfikator wątku

Sep 11 2020

W GNU Parallel z opcją -j można określić liczbę współbieżnych zadań.

Czy można uzyskać identyfikator wątku uruchamiającego zadanie ?. Identyfikator wątku oznacza liczbę od 1 do 12 na mojej maszynie z 12 wątkami. Na razie stosuję następujące obejście:

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

Ma to taki problem, że każda iteracja pętli czeka na zakończenie wszystkich 12 wątków. Interesuje mnie tylko jednoczesne nie uruchamianie iteracji z tym samym identyfikatorem wątku.

Moją motywacją jest to, że każdy wątek używa blokady zapisu na jednym z 12 plików. Mam dokładnie 12 plików i jeśli wątek na jednym pliku zakończy się, następny wątek może natychmiast ponownie użyć tego pliku.

Odpowiedzi

OleTange Sep 14 2020 at 16:25

Jak pisze @MarkSetchell, powinieneś użyć zastępczego ciągu znaków {%}, który podaje numer stanowiska pracy:

parallel --line-buffer -j12 'echo starting job {#} on {%}; sleep {=$_=rand()*30=}; echo finishing job {#} on {%}' ::: {1..50}