GNU Parallel: thread id

Sep 11 2020

No GNU Parallel com a opção -j, é possível especificar o número de trabalhos simultâneos.

É possível obter um id do thread que está executando o trabalho ?. Com ID de thread, quero dizer um número de 1 a 12 na minha máquina com 12 threads. A partir de agora, uso a seguinte solução 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

Isso tem o problema de que cada iteração do loop espera que todos os 12 threads terminem. Estou apenas interessado em não executar iterações com o mesmo id de thread simultaneamente.

Minha motivação para isso é que cada thread usa um writelock em um dos 12 arquivos. Eu tenho exatamente 12 arquivos e se um thread em um arquivo terminar, o próximo thread pode usar imediatamente esse arquivo novamente.

Respostas

OleTange Sep 14 2020 at 16:25

Enquanto @MarkSetchell escreve, você deve usar a string de substituição {%} que fornece o número do slot de trabalho:

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