我正在使用一些多处理Python脚本multiprocessing.Pool
。这些脚本如下所示:
from multiprocessing import Pool
def f(x):
return x*x
if __name__ == '__main__':
with Pool(processes=4) as pool: # start 4 worker processes
print(pool.map(f, range(10))) # prints "[0, 1, 4,..., 81]"
当使用 Python 3.4 运行它时,一切都很好。然而,当使用Python时2.6 or 3.1我收到此错误:
AttributeError: 'Pool' object has no attribute '__exit__'
使用Python2.7 or 3.2,错误本质上是相同的:
AttributeError: __exit__
为什么会发生这种情况以及如何避免这种情况?
The 文档说multiprocessing.pool
支持上下文管理协议(with
Python 版本中的语句)3.3以上。
3.3 版新增功能:池对象现在支持上下文管理协议 - 请参阅上下文管理器类型。__enter__()
返回池对象,并且__exit__()
calls terminate()
.
所以你要么需要一个较新版本的 Python,或使用以下两种可能性之一改变你的代码(使用 Python 版本 2.6、2.7、3.1、3.2 进行测试):
-
像这样重写你的代码以消除with
陈述:
from multiprocessing import Pool
def f(x):
return x*x
if __name__ == '__main__':
pool = Pool(processes=4) # start 4 worker processes
print(pool.map(f, range(10))) # prints "[0, 1, 4,..., 81]"
pool.terminate()
-
正如评论中指出的,使用contextlib.closing()
:
from multiprocessing import Pool
import contextlib
def f(x):
return x*x
if __name__ == '__main__':
with contextlib.closing(Pool(processes=4)) as pool:
print(pool.map(f, range(10)))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)