GNU Parallel: id de thread

Sep 11 2020

Dans GNU Parallel avec l'option -j, il est possible de spécifier le nombre de travaux simultanés.

Est-il possible d'obtenir un identifiant du thread exécutant le travail?. Avec id de fil, je veux dire un nombre de 1 à 12 sur ma machine avec 12 fils. À partir de maintenant, j'utilise la solution de contournement suivante:

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

Cela a le problème que chaque itération de la boucle attend la fin des 12 threads. Je ne suis intéressé que par le fait de ne pas exécuter d'itérations avec le même identifiant de thread simultanément.

Ma motivation pour cela est que chaque thread utilise un verrou d'écriture sur l'un des 12 fichiers. J'ai exactement 12 fichiers et si un fil sur un fichier se termine, le fil suivant pourrait immédiatement utiliser à nouveau ce fichier.

Réponses

OleTange Sep 14 2020 at 16:25

Comme @MarkSetchell écrit, vous devez utiliser la chaîne de remplacement {%} qui donne le numéro de joblot:

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