在研究如何并行化bash任务时,我偶然发现了这样的代码:
for item in "${items[@]}"
do
((i=i%THREADS)); ((i++==0)) && wait
process_item $item &
done
process_item
是使用item的函数/程序之王,THREADS
var包含可以同时运行的最大后台进程数。
有人可以向我解释一下这是如何运作的吗?我了解i=i%THREADS
确保i
介于0
和THREADS-1
之间,i++==0
递增i
并检查0
是否wait
}}。但lst =['Name=Sachin\n','country=India\n','game=cricket\n']
dct = dict( (item.split('=')[0], item.split('=')[1].strip()) for item in lst )
print(dct)
# {'game': 'cricket', 'country': 'India', 'Name': 'Sachin'}
是否绑定到所有子进程?或者它如何知道必须等到上一批停止处理?
答案 0 :(得分:0)
i++==0
检查和增加,而不是相反。 wait
等待所有当前活动的子进程。因此,每次迭代(但第一次,感谢((i++==0))
)首先等待上一次迭代启动的进程并启动一个新进程。
答案 1 :(得分:0)
这是一种模糊的写作方式
for item in "${items[@]}"
do
# Every THREADSth job, stop and wait for everything
# to complete.
if (( i % THREADS == 0 )); then
wait
fi
((i++))
process_item $item &
done
它实际上并没有很好地工作。它不会确保始终有$THREADS
个作业正在运行,只有一次只能运行$THREADS
个作业。