Parallela GNU: ID thread

Sep 11 2020

In GNU Parallel con l'opzione -j è possibile specificare il numero di lavori simultanei.

È possibile ottenere un id del thread che esegue il lavoro ?. Con ID thread intendo un numero da 1 a 12 sulla mia macchina con 12 thread. A partire da ora utilizzo la seguente soluzione alternativa:

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

Questo ha il problema che ogni iterazione del ciclo attende che tutti i 12 thread finiscano. Sono interessato solo a non eseguire iterazioni con lo stesso ID thread contemporaneamente.

La mia motivazione per questo è che ogni thread utilizza un writelock su uno dei 12 file. Ho ottenuto esattamente 12 file e se un thread su un file termina, il thread successivo potrebbe utilizzare di nuovo immediatamente questo file.

Risposte

OleTange Sep 14 2020 at 16:25

Come scrive @MarkSetchell, dovresti usare la stringa di sostituzione {%} che fornisce il numero del lotto di lavoro:

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