【发布时间】:2018-01-27 20:58:26
【问题描述】:
我试图了解Pool.apply_async 中的callback 函数是如何工作的,但遇到了以下问题。在回调之外,我定义了
results = []
并希望在值可用时使用回调将工作进程的返回值附加到results。
不过,奇怪的是这个语句(在回调中)有效:
results.append(t)
但是
results += [t]
报告未分配的引用错误。
发生了什么事?任何见解将不胜感激!
这里是完整的代码:
from multiprocessing import Pool
import random
results = []
def f(t):
return t
def cb_append_result(t):
# reports "local variable 'results' referenced before assignment"
# results += [t]
# Okay
results.append(t) # works
if __name__ == '__main__':
pool = Pool()
t = random.random()
pool.apply_async(f,args=(t,),callback=cb_append_result)
pool.close()
pool.join()
print("Result is {}".format(results))
(添加)该问题与多处理或回调无关(请参阅下面的答案)。但是要解决上面的问题,回调函数应该写成
def cb_append_result(t):
global results
results += [t]
【问题讨论】:
-
是的——就是这样!事实上,我怀疑有这样的事情,但无法忘记
append和+=在逻辑上做同样的事情(更改现有对象)的事实。我将在下面发布解决方案。