属性错误: 'Pool'对象没有属性'__exit__'



我正在使用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.63.1时,我收到此错误:

AttributeError: 'Pool' object has no attribute '__exit__'

使用 Python 2.7 或 3.2,错误本质上是相同的:

AttributeError: __exit__

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

文档说multiprocessing.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)))
    

相关内容

  • 没有找到相关文章

最新更新