use*_*007 7 python python-3.1 python-2.7 python-3.2 python-multiprocessing
我正在使用一些多处理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]"
Run Code Online (Sandbox Code Playgroud)
使用Python 3.4运行时,一切都很好.但是,当使用Python 2.6或3.1时,我收到此错误:
AttributeError: 'Pool' object has no attribute '__exit__'
Run Code Online (Sandbox Code Playgroud)
使用Python 2.7或3.2,错误基本相同:
AttributeError: __exit__
Run Code Online (Sandbox Code Playgroud)
为什么会发生这种情况,我该如何规避呢?
use*_*007 17
的文档说,multiprocessing.pool支持上下文管理协议(with在Python版本语句)3.3及以上.
版本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()
Run Code Online (Sandbox Code Playgroud)正如评论中指出的那样,使用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)))
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
9263 次 |
| 最近记录: |