如何限制后台工作?

时间:2015-09-16 07:35:50

标签: bash parallel-processing batch-processing background-process

在研究如何并行化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介于0THREADS-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'} 是否绑定到所有子进程?或者它如何知道必须等到上一批停止处理?

2 个答案:

答案 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个作业。