我正在使用multiprocessing.Pool
做一些多处理python脚本。这些脚本如下所示:
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 或 3.1 时,我收到此错误:
AttributeError: 'Pool' object has no attribute '__exit__'
使用Python 2.7 或 3.2 ,错误基本相同:
AttributeError: __exit__
为什么会发生这种情况,我该如何规避?
答案 0 :(得分:17)
documentation表示multiprocessing.pool
支持Python版 3.3 及更高版本中的上下文管理协议(with
语句)。
3.3版中的新功能:池对象现在支持上下文管理协议 - 请参阅上下文管理器类型。
__enter__()
返回池对象,__exit__()
调用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)))