我正在尝试对类方法使用map_async
,得到以下错误:
PicklingError: Can't pickle <type 'thread.lock'>: attribute lookup thread.lock failed
我的代码:
def _pickle_method(method):
func_name = method.im_func.__name__
obj = method.im_self
cls = method.im_class
cls_name = ''
if func_name.startswith('__') and not func_name.endswith('__'):
cls_name = cls.__name__.lstrip('_')
if cls_name:
func_name = '_' + cls_name + func_name
return _unpickle_method, (func_name, obj, cls)
def _unpickle_method(func_name, obj, cls):
for cls in cls.mro():
try:
func = cls.__dict__[func_name]
except KeyError:
pass
else:
break
return func.__get__(obj, cls)
copy_reg.pickle(types.MethodType, _pickle_method, _unpickle_method)
class MyClass(object):
def Submit(self,cmd):
subprocess.call(cmd, shell=True)
def RunTest(self):
cmds = []
for i in range(50):
cmd = CreateCmd(self)
cmds.append(cmd)
self.pool.map_async(self.Submit, cmds)
def Main(self):
self.pool = mp.pool
while True:
RunTest(self)
if __name__ == "__main__":
MyClass()
当Submit
在类之外时,它可以工作,但像这样我会得到错误。
另外,MyClass
还有一些我没有编写的方法和属性,其中一个是记录器,这可能是问题所在吗?
所以我用一些替代导入构建了您的代码,特别是
dill
,而不是pickle
。我还使用了一个名为pathos.multiprocessing
的multiprocessing
叉,它使用dill
。我可以腌制你的类方法和绑定方法。我忽略了你教copy_reg
如何pickle模块的整个部分,因为dill
已经可以做到了。我不得不对你的代码做一些修改,因为它不起作用。我还得做一个CreateCmd函数,因为你没有给它。同样,这段代码本身也会启动多处理作业…但你永远不会得到结果,因为你没有要求它们。你到底想干什么?
不管怎么说,这里有一些代码和你的一样,但是很有用。它仍然没有给你任何有价值的结果,除了显示它会泡菜和代码运行。请发布可以运行的代码,并将抛出您正在报告的错误。
不管怎样,如果您想要
dill
或pathos
,您可以在https://github.com/uqfoundation找到它们顺便说一句,如果你想撬开一个线程锁,你也可以这么做。
相关问题 更多 >
编程相关推荐