Parallela GNU: ID thread
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
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}