Python多处理库错误(AttributeError:__ exit__)

时间:2014-09-22 07:15:47

标签: python multiprocessing pickle with-statement contextmanager

使用pool.map(funct, iterable)时出现此错误:

AttributeError: __exit__

否解释,只将堆栈跟踪到模块中的pool.py文件。

以这种方式使用:

with Pool(processes=2) as pool:
   pool.map(myFunction, mylist)
   pool.map(myfunction2, mylist2)

我怀疑可挑选性可能存在问题(python需要pickle,或者将列表数据转换为字节流)但我不确定这是否属实或是否如何调试

编辑:产生此错误的新格式代码:

def governingFunct(list):
    #some tasks
    def myFunction():
         # function contents
    with closing(Pool(processes=2)) as pool:
         pool.map(myFunction, sublist)
         pool.map(myFunction2, sublist2)

错误产生:

PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed

2 个答案:

答案 0 :(得分:47)

在Python 2.x和3.0,3.1和3.2中,multiprocessing.Pool()个对象不是上下文管理器。您不能在with语句中使用它们。只有在Python 3.3及更高版本中才能使用它们。来自Python 3 multiprocessing.Pool() documentation

  

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

对于早期的Python版本,您可以使用contextlib.closing(),但请考虑这个'将调用 pool.close() ,而不是pool.terminate()。在这种情况下手动终止:

from contextlib import closing

with closing(Pool(processes=2)) as pool:
    pool.map(myFunction, mylist)
    pool.map(myfunction2, mylist2)
    pool.terminate()

或创建自己的terminating()上下文管理器:

from contextlib import contextmanager

@contextmanager
def terminating(thing):
    try:
        yield thing
    finally:
        thing.terminate()

with terminating(Pool(processes=2)) as pool:
    pool.map(myFunction, mylist)
    pool.map(myfunction2, mylist2)

答案 1 :(得分:1)

with语句适用于具有__enter____exit__功能的对象,即Context Manager Types
multiprocessing.Pool不是上下文管理器类型。 尝试执行以下操作:

pool = Pool(processes=2)
pool.map(myFunction, mylist)
pool.map(myfunction2, mylist2)