仍然是Python的初学者。当我期待一个包含五个2s
的数组时,不知道为什么会打印出一个空数组from multiprocessing import Pool
results = []
def func(a=1):
if a == 1:
return 1
return 2
def collect_results(result):
results.append(result)
if __name__=="__main__":
poolObjects = []
pool = Pool(processes=2)
poolObjects = [pool.apply_async(func, args=(2), callback=collect_results) for i in range(5)]
pool.close()
pool.join()
print results
但是当我将poolObjects行更改为此
时poolObjects = [pool.apply_async(func, callback=collect_results) for i in range(5)]
它工作正常并打印出五个1的数组。我在这里做错了什么?
答案 0 :(得分:1)
您的问题在于您如何传递参数:args
必须是元组(或序列)。所以改变
... args=(2) ...
到
... args=(2,) ...
尾随逗号创建一个长度为1的元组,其中包含整数2。
然后你的程序将打印
[2, 2, 2, 2, 2]
那么为什么你没有收到错误?你做了;-) - 但它被压制了。错误不会发生在主程序中,而是发生在安排跨过程边界发送工作的后台机器中。报告此类错误根本没有好方法,因此它们会被抑制。
对于apply_async
,错误将被保存,等待您将.get()
应用于结果对象。
因此,例如,将此循环添加到原始程序的末尾:
for f in poolObjects:
f.get()
然后会报告被抑制的错误,如下所示:
TypeError: func() argument after * must be a sequence, not int