我正在尝试遵循一个非常简单的多处理示例:
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,则会看到以下内容:
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].ready()
False
如果我运行results[0].get()python解释器冻结,则等待获取永远不会出现的结果。
results[0].get()
该示例非常简单,因此我认为这是与OS相关的低级错误(我在Windows 7上)。但是也许其他人有更好的主意?
这里有两个错误。首先,在Windows上运行时,必须声明Pool内部if __name__ == "__main__":保护。其次,即使只传递一个参数,也必须给关键字参数传递一个序列。所以放在一起:args
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 那样,在交互式解释器中不能很好地工作:
multiprocessing
注意 此软件包中的功能要求该__main__模块可由子级导入。编程指南中对此进行了介绍,但是这里值得指出。这意味着某些示例(例如multiprocessing.Pool示例)在交互式解释器中将不起作用。
注意
此软件包中的功能要求该__main__模块可由子级导入。编程指南中对此进行了介绍,但是这里值得指出。这意味着某些示例(例如multiprocessing.Pool示例)在交互式解释器中将不起作用。
__main__
multiprocessing.Pool
因此,您实际上需要将代码作为脚本执行才能正确测试。