GNU Parallel: Thread-ID

Sep 11 2020

In GNU Parallel zur Option -j kann die Anzahl der gleichzeitigen Jobs angegeben werden.

Ist es möglich, eine ID des Threads zu erhalten, der den Job ausführt? Mit Thread-ID meine ich eine Zahl von 1 bis 12 auf meinem Computer mit 12 Threads. Ab sofort verwende ich die folgende Problemumgehung:

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

Dies hat das Problem, dass jede Iteration der Schleife darauf wartet, dass alle 12 Threads beendet sind. Ich bin nur daran interessiert, nicht gleichzeitig Iterationen mit derselben Thread-ID auszuführen.

Meine Motivation dafür ist, dass jeder Thread ein Writelock für eine von 12 Dateien verwendet. Ich habe genau 12 Dateien erhalten und wenn ein Thread in einer Datei beendet ist, kann der nächste Thread diese Datei sofort wieder verwenden.

Antworten

OleTange Sep 14 2020 at 16:25

Während @MarkSetchell schreibt, sollten Sie die Ersatzzeichenfolge {%} verwenden, die die Jobschlitznummer angibt:

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