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 <type 'function'>: 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__)的主要内容,如果未能解决你的问题,请参考以下文章