传递参数

时间:2017-03-02 21:19:35

标签: python multiprocessing

仍然是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的数组。我在这里做错了什么?

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