GNU Parallel: идентификатор потока

Sep 11 2020

В GNU Parallel с параметром -j можно указать количество одновременных заданий.

Можно ли получить идентификатор потока, выполняющего задание? Под идентификатором потока я подразумеваю число от 1 до 12 на моей машине с 12 потоками. На данный момент я использую следующий обходной путь:

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

Проблема заключается в том, что каждая итерация цикла ожидает завершения всех 12 потоков. Меня интересует только то, чтобы не запускать итерации с одним и тем же идентификатором потока одновременно.

Моя мотивация для этого заключается в том, что каждый поток использует блокировку записи для одного из 12 файлов. У меня есть ровно 12 файлов, и если поток с одним файлом завершается, следующий поток может немедленно использовать этот файл снова.

Ответы

OleTange Sep 14 2020 at 16:25

Как пишет @MarkSetchell, вы должны использовать заменяющую строку {%}, которая дает номер рабочего места:

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