以下代码返回错误:
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和其他地方的其他帖子,其他问题都没有解决上述完全相同的问题。
发生错误的原因很可能是您没有像在run()
函数中那样通过global count
提供全局变量count
。
无论如何,这不会像你希望的那样奏效。每个派生的进程都有自己的全局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