以下代码返回错误:
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和其他地方的其他帖子,其他任何问题都没有解决上述完全相同的问题。
答案 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