AttributeError:'Pool'对象没有属性'__exit__'

问题描述 投票:7回答:1

我正在使用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__

为什么会发生这种情况,我该如何规避呢?

python python-2.7 python-multiprocessing python-3.2 python-3.1
1个回答
17
投票

documentationmultiprocessing.pool支持Python 3.3及更高版本中的上下文管理协议(with语句)。

版本3.3中的新功能:池对象现在支持上下文管理协议 - 请参阅上下文管理器类型。 __enter__()返回池对象,__exit__()调用terminate()

因此,您需要更新版本的Python,或者使用以下两种可能性之一来更改您的代码(使用Python版本2.6,2.7,3.1,3.2进行测试):

  1. 像这样重写你的代码来消除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()
  2. 正如评论中指出的那样,使用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)))
© www.soinside.com 2019 - 2024. All rights reserved.