很抱歉,我不能用一个更简单的例子重现这个错误,而且我的代码太复杂,无法发布.如果我用IPython shell而不是普通的Python运行这个程序,事情就会进展顺利.

我查阅了以前关于这个问题的一些笔记.它们都是由使用池调用类函数中定义的函数引起的.但对我来说情况并非如此.

Exception in thread Thread-3:
Traceback (most recent call last):
  File "/usr/lib64/python2.7/threading.py", line 552, in __bootstrap_inner
    self.run()
  File "/usr/lib64/python2.7/threading.py", line 505, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/usr/lib64/python2.7/multiprocessing/pool.py", line 313, in _handle_tasks
    put(task)
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed

我将非常感谢您的帮助.

Update:函数i Pickle在模块的顶层定义.虽然它调用包含嵌套函数的函数.即,f()调用g()调用h(),而h()具有嵌套函数i(),而我正在调用pool.apply_async(f).f()g()h()都是在顶层定义的.我使用此模式try 了更简单的示例,但它仍然有效.

推荐答案

这是list of what can be pickled美元.尤其是,如果函数是在模块的顶层定义的,那么它们才是可 Select 的.

这段代码:

import multiprocessing as mp

class Foo():
    @staticmethod
    def work(self):
        pass

if __name__ == '__main__':   
    pool = mp.Pool()
    foo = Foo()
    pool.apply_async(foo.work)
    pool.close()
    pool.join()

产生与您发布的错误几乎相同的错误:

Exception in thread Thread-2:
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 552, in __bootstrap_inner
    self.run()
  File "/usr/lib/python2.7/threading.py", line 505, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/usr/lib/python2.7/multiprocessing/pool.py", line 315, in _handle_tasks
    put(task)
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed

问题是,这pool种方法都使用mp.SimpleQueue将任务传递给工作进程.通过mp.SimpleQueue的所有内容都必须是可拾取的,foo.work不可拾取,因为它没有在模块的顶层定义.

它可以通过在顶层定义一个函数来修复,该函数调用foo.work():

def work(foo):
    foo.work()

pool.apply_async(work,args=(foo,))

请注意,foo是可拾取的,因为Foo是在顶层定义的,而foo.__dict__是可拾取的.

Python相关问答推荐

如何根据条件在多指标框架上进行groupby

Python 3.12中的通用[T]类方法隐式类型检索

仿制药的类型铸造

从收件箱中的列中删除html格式

需要计算60,000个坐标之间的距离

如何根据参数推断对象的返回类型?

从numpy数组和参数创建收件箱

Pandas:将多级列名改为一级

如何从pandas的rame类继承并使用filepath实例化

如何使用Pandas DataFrame按日期和项目汇总计数作为列标题

Python Pandas获取层次路径直到顶层管理

在极中解析带有数字和SI前缀的字符串

在Admin中显示从ManyToMany通过模型的筛选结果

计算空值

Discord.py -

如果有2个或3个,则从pandas列中删除空格

在我融化极点数据帧之后,我如何在不添加索引的情况下将其旋转回其原始形式?

Pandas数据框上的滚动平均值,其中平均值的中心基于另一数据框的时间

在matplotlib中重叠极 map 以创建径向龙卷风图

有没有一种方法可以根据不同索引集的数组从2D数组的对称子矩阵高效地构造3D数组?