监视Python并行进程的进度

时间:2015-03-31 09:25:18

标签: python parallel-processing global-variables counter python-multiprocessing

以下代码返回错误:

local variable 'count' referenced before assignment.

以下是两个功能:

def run():
    ...
    global count
    count = 0
    with closing(Pool(processes=4)) as pool:
    pool.map(run_in_parallel, listOfIds)
    pool.terminate()
    ...

def run_in_parallel(id):
    count += 1
    if count % 1000 == 0:
        print('Processed %d %s' % (count, time.strftime('%x %X')))
    # Do main work in parallel

错误仅因修改语句而弹出。即

count +=1

我在几个地方读过,在工作进程中修改全局变量不是一个好习惯。但是由于listOfIds是一个巨大的列表,我需要一些方法来监视进度并偶尔打印到终端。怎么做?

我已阅读StackOverflow和其他地方的其他帖子,其他任何问题都没有解决上述完全相同的问题。

1 个答案:

答案 0 :(得分:0)

错误的发生很可能是因为您没有通过count提供全局变量global count,就像您在run()函数中所做的那样。

无论如何,这不会像你希望它一样工作。每个衍生过程都会拥有它自己的全局count变量,该变量将在创建时递增,并且在创建时始终为0

如果你想这样计算,你应该使用Tom Dalton为你链接的例子:

import time
from multiprocessing import Process, Value

def func(val):
    for i in range(50):
        time.sleep(0.01)
        val.value += 1

if __name__ == '__main__':
    v = Value('i', 0)
    procs = [Process(target=func, args=(v,)) for i in range(10)]

    for p in procs: p.start()
    for p in procs: p.join()

    print v.value