Python 多处理库错误(AttributeError:__exit__)

Posted

技术标签:

【中文标题】Python 多处理库错误(AttributeError:__exit__)【英文标题】:Python Multiprocessing Lib Error (AttributeError: __exit__) 【发布时间】:2014-11-16 02:10:50 【问题描述】:

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

AttributeError: __exit__

没有解释,只是堆栈跟踪到模块内的 pool.py 文件。

这样使用:

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

我怀疑picklability可能存在问题(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

【问题讨论】:

while .. as 是什么意思?你的意思是with 请务必包含错误的完整回溯,以及您的实际代码。例如,while 在这里是一个明显的语法错误,但从异常中可以明显看出您确实使用了with 【参考方案1】:

在 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)

【讨论】:

先生,谢谢您如此详细的解释。您的解决方案使该功能更接近工作 - 现在我收到此错误:PicklingError: Can't pickle &lt;type 'function'&gt;: attribute lookup __builtin__.function failed @sidewaiise:您是否尝试在类上使用方法?见Multiprocessing: using Pool.map on a function defined in a class 嘿,当您发布此内容时,我实际上只是在阅读。谢谢 - 我很快就会阅读并发表评论。 不确定我是否理解该链接上的解决方案 - 我没有使用类。它就像我上面写的一样简单,除了它在另一个函数中......例如:**** 参考编辑的问题 ^ **** 所以不确定.. 有什么想法吗? @paulochf:由于某种原因,装饰器行丢失了。仅在您实际计划使用它时才导入它! :-)(和对不起)。【参考方案2】:

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

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

【讨论】:

问题是为什么 OP 认为它是。答案是 Python 3 文档告诉你它是。但它也符合 Python 3.3 及更高版本的要求。

以上是关于Python 多处理库错误(AttributeError:__exit__)的主要内容,如果未能解决你的问题,请参考以下文章

Bigquery 存储 API 多处理段错误

日志服务Python消费组实战:实时跨域监测多日志库数据

Python,多处理库问题

python-daemon 和多处理库之间的区别

python 串口

python 使用Python的多处理库在进程之间传递套接字的示例