Python多处理库错误(AttributeError:
使用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
在Python 2.x和3.0,3.1和3.2中, multiprocessing.Pool()
对象不是上下文管理器。 你不能在with
语句中使用它们。 只有在Python 3.3及更高版本中,您才可以使用它们。 从Python 3 multiprocessing.Pool()
文档:
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)
with
说法是对那些对象__enter__
和__exit__
功能,即上下文管理器类型
multiprocessing.Pool
不是上下文管理器类型。 请尝试执行以下操作:
pool = Pool(processes=2)
pool.map(myFunction, mylist)
pool.map(myfunction2, mylist2)
链接地址: http://www.djcxy.com/p/55263.html
上一篇: Python Multiprocessing Lib Error (AttributeError:
下一篇: What is the technical difference between a process and a thread?