sid*_*ise 32 python pickle multiprocessing with-statement contextmanager
使用时遇到此错误pool.map(funct, iterable):
AttributeError: __exit__
Run Code Online (Sandbox Code Playgroud)
否解释,只将堆栈跟踪到模块中的pool.py文件.
以这种方式使用:
with Pool(processes=2) as pool:
pool.map(myFunction, mylist)
pool.map(myfunction2, mylist2)
Run Code Online (Sandbox Code Playgroud)
我怀疑可挑选性可能存在问题(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)
Run Code Online (Sandbox Code Playgroud)
错误产生:
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
Run Code Online (Sandbox Code Playgroud)
Mar*_*ers 51
在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()
Run Code Online (Sandbox Code Playgroud)
或创建自己的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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17492 次 |
| 最近记录: |