Python多处理PicklingError:不能选择<type‘>函数

Python多处理PicklingError:不能选择<type‘>函数

很抱歉,我不能用一个简单的例子来重现错误,而且我的代码太复杂了,无法发布。如果我用IPythonshell而不是普通的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

如果有什么帮助我会很感激的。

更新:在模块的顶层定义了函数I泡菜。尽管它调用了一个包含嵌套函数的函数。也就是说,f()打电话g()打电话h()它有一个嵌套函数i(),我打电话给你pool.apply_async(f)f()g()h()都是在顶层定义的。我用这个模式尝试了一个更简单的例子,但它还是起作用了。


吃鸡游戏
浏览 1519回答 3
3回答

jeck猫

就像其他人说的multiprocessing只能将Python对象传输到可以被腌制的工作进程。如果不能像unutbu所描述的那样重新组织代码,则可以使用dills扩展了用于传输数据(特别是代码数据)的酸洗/反酸洗功能,如下所示。此解决方案只需要安装dill也没有其他图书馆pathos:import&nbsp;osfrom&nbsp;multiprocessing&nbsp;import&nbsp;Poolimport&nbsp;dilldef&nbsp;run_dill_encoded(payload): &nbsp;&nbsp;&nbsp;&nbsp;fun,&nbsp;args&nbsp;=&nbsp;dill.loads(payload) &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;fun(*args)def&nbsp;apply_async(pool,&nbsp;fun,&nbsp;args): &nbsp;&nbsp;&nbsp;&nbsp;payload&nbsp;=&nbsp;dill.dumps((fun,&nbsp;args)) &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;pool.apply_async(run_dill_encoded,&nbsp;(payload,))if&nbsp;__name__&nbsp;==&nbsp;"__main__": &nbsp;&nbsp;&nbsp;&nbsp;pool&nbsp;=&nbsp;Pool(processes=5) &nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;asyn&nbsp;execution&nbsp;of&nbsp;lambda &nbsp;&nbsp;&nbsp;&nbsp;jobs&nbsp;=&nbsp;[] &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;i&nbsp;in&nbsp;range(10): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;job&nbsp;=&nbsp;apply_async(pool,&nbsp;lambda&nbsp;a,&nbsp;b:&nbsp;(a,&nbsp;b,&nbsp;a&nbsp;*&nbsp;b),&nbsp;(i,&nbsp;i&nbsp;+&nbsp;1)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jobs.append(job) &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;job&nbsp;in&nbsp;jobs: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;job.get() &nbsp;&nbsp;&nbsp;&nbsp;print &nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;async&nbsp;execution&nbsp;of&nbsp;static&nbsp;method &nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;O(object): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@staticmethod &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;calc(): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;os.getpid() &nbsp;&nbsp;&nbsp;&nbsp;jobs&nbsp;=&nbsp;[] &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;i&nbsp;in&nbsp;range(10): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;job&nbsp;=&nbsp;apply_async(pool,&nbsp;O.calc,&nbsp;()) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jobs.append(job) &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;job&nbsp;in&nbsp;jobs: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;job.get()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python