使用多处理时出现以下错误:
Exception in thread Thread-2:
Traceback (most recent call last):
File "/usr/lib/python2.6/threading.py", line 525, in __bootstrap_inner
self.run()
File "/usr/lib/python2.6/threading.py", line 477, in run
self.__target(*self.__args, **self.__kwargs)
File "/usr/lib/python2.6/multiprocessing/pool.py", line 282, in _handle_results
task = get()
UnpicklingError: NEWOBJ class argument has NULL tp_new
我完全不知道这是什么意思,尽管在 C 级别听起来有些不对劲。任何人都可以阐明这一点吗?
更新:好的,所以我想出了如何解决这个问题。但我还是有点困惑。我正在返回此类的一个实例:
class SpecData(object):
def __init__(self, **kwargs):
self.__dict__.update(**kwargs)
def to_dict(self):
return self.__dict__
如果我返回这个对象的一个实例,我会得到错误。但是,如果我调用 to_dict
并返回字典,它就可以工作。我做错了什么?
最佳答案
尝试使用 pickle
模块而不是 cPickle
模块 -- pickle
是用纯 Python 编写的,通常它会给出更有用的错误消息比 cPickle
。 (尽管有时我不得不求助于制作 pickle.py
的本地副本,并在错误位置附近添加一些调试 printf 语句以找出问题所在。)
找到问题后,您可以切换回 cpickle。
(我不太熟悉 multiprocessing 模块,所以我不确定你是在做 pickling 还是在做。如果是,那么使用 pickle 而不是 cpickle 的最简单方法可能在导入多处理/线程模块之前做一些猴子修补:import sys, pickle; sys.modules['cPickle']=pickle
)
关于python - 使用多处理时出现奇怪的 unpickling 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1953261/