python - 使用多处理时出现奇怪的 unpickling 错误

标签 python exception multiprocessing pickle python-multiprocessing

使用多处理时出现以下错误:

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/

相关文章:

python - 如何使用带有多个参数的多处理 pool.map

Python 名称错误 : name is not defined for my script

python - Google OAuth 不会在 authlib.starlette_client 中返回refresh_token

c# - FileNotFoundException - 动态发现

Python:多核处理?

python - Python 多处理是否从父级复制所有模块?

python - 为什么我收到 TypeError : cannot unpack non-iterable builtin_function_or_method object?

python - 如何通过更新 OrderedDict 来保持订单

c++ - 未捕获异常。访问违规读取位置

c++ - 为什么 C++ STL iostreams 不是 "exception friendly"?