GNU并行:线程ID

问题描述

在带有-j选项的GNU Parallel中,可以指定并发作业数。

是否可以获得运行作业的线程的ID?线程ID是指来自 我的计算机上具有12个线程的1到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个线程完成。 我只对不同时运行具有相同线程ID的迭代感兴趣。

我这样做的动机是每个线程在12个文件之一上使用写锁。我刚好有12个文件,如果一个文件上的一个线程结束,下一个线程可以立即再次使用该文件

解决方法

如@MarkSetchell所写,您应该使用替换字符串{%},该字符串给出了作业编号:

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