我想了解 callback 中的函数 Pool.apply_async 工作,并遇到以下问题。在回调之外,我定义
callback
Pool.apply_async
results = []
并希望使用回调将工作进程的返回值附加到 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]
该解决方案实际上与多处理或回调无关。关键是使用 global 语句显式引用全局变量。
global
下面是一个简单的代码来演示这个问题。
y = [] # doesn't work def f(x): y += [x] # works def g(x): global y # <===== Answer!! y += [x] # works def h(x): y.append(x) # f(1) # local variable 'y' referenced before assignment g(1) # works print(y) h(2) # works print(y)
输出:
[1] [1, 2]
所以事实上 callback 生意等都搞糊涂了。我已经编辑了我原来的帖子。