小编典典

Python多重处理apply_async永远不会在Windows 7上返回结果

python

我正在尝试遵循一个非常简单的多处理示例:

import multiprocessing as mp

def cube(x):
    return x**3

pool    = mp.Pool(processes=2)
results = [pool.apply_async(cube, args=x) for x in range(1,7)]

但是,在我的Windows机器上,我无法获得结果(在ubuntu 12.04LTS上,它运行正常)。

如果我检查results,则会看到以下内容:

[<multiprocessing.pool.ApplyResult object at 0x01FF0910>,
 <multiprocessing.pool.ApplyResult object at 0x01FF0950>,
 <multiprocessing.pool.ApplyResult object at 0x01FF0990>,
 <multiprocessing.pool.ApplyResult object at 0x01FF09D0>,
 <multiprocessing.pool.ApplyResult object at 0x01FF0A10>,
 <multiprocessing.pool.ApplyResult object at 0x01FF0A50>]

如果我跑步,results[0].ready()我总能得到False

如果我运行results[0].get()python解释器冻结,则等待获取永远不会出现的结果。

该示例非常简单,因此我认为这是与OS相关的低级错误(我在Windows 7上)。但是也许其他人有更好的主意?


阅读 224

收藏
2020-12-20

共1个答案

小编典典

这里有两个错误。首先,在Windows上运行时,必须声明Pool内部if __name__ == "__main__":保护。其次,即使只传递一个参数,也必须给关键字参数传递一个序列。所以放在一起:args

import multiprocessing as mp

def cube(x):
    return x**3

if __name__ == "__main__":
    pool    = mp.Pool(processes=2)
    results = [pool.apply_async(cube, args=(x,)) for x in range(1,7)]
    print([result.get() for result in results])

输出:

[1, 8, 27, 64, 125, 216]

编辑:

哦,正如moarningsun提到的multiprocessing
那样,在交互式解释器中不能很好工作

注意

此软件包中的功能要求该__main__模块可由子级导入。编程指南中对此进行了介绍,但是这里值得指出。这意味着某些示例(例如multiprocessing.Pool示例)在交互式解释器中将不起作用。

因此,您实际上需要将代码作为脚本执行才能正确测试。

2020-12-20