传递参数时,Python多处理池async_apply callback不工作

2024-09-28 19:26:12 发布

您现在位置:Python中文网/ 问答频道 /正文

仍然是Python的初学者。不知道为什么当我期望一个包含5个2的数组时会输出一个空数组

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行改成

^{pr2}$

它可以打印出5个1的数组。我做错什么了?在


Tags: fromreturnifdef数组resultmultiprocessingresults
1条回答
网友
1楼 · 发布于 2024-09-28 19:26:12

问题在于如何传递参数:args必须是元组(或序列)。所以改变

... args=(2) ...

^{pr2}$

后面的逗号创建一个长度为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

相关问题 更多 >