Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Can';t pickle函数_Python_Multiprocessing_Pool - Fatal编程技术网

Python Can';t pickle函数

Python Can';t pickle函数,python,multiprocessing,pool,Python,Multiprocessing,Pool,所以我试图通过做一点多处理来加速我的计算时间 我想用游泳池工人 在我的代码顶部,我有 import Singal as s import multiprocessing as mp def wrapper(Channel): Noise_Frequincies = [] for i in range(1,125): Noise_Frequincies.append(60.0*float(i)) Noise_Frequincies.append(180.0)

所以我试图通过做一点多处理来加速我的计算时间

我想用游泳池工人

在我的代码顶部,我有

import Singal as s
import multiprocessing as mp
def wrapper(Channel):
    Noise_Frequincies = []
    for i in range(1,125):
        Noise_Frequincies.append(60.0*float(i))
    Noise_Frequincies.append(180.0)
    filter1 = s.Noise_Reduction(Sample_Rate,Noise_Frequincies,Channel)
    return filter1
到时候我就用

Both_Channels = [Chan1, Chan2]
results = mp.Pool(2).map(wrapper,Both_Channels)
filter1 = results[0]
filter2 = results[1]
我得到以下错误

Exception in thread Thread-2:
Traceback (most recent call last):
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 808, in __bootstrap_inner
self.run()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 761, in run
self.__target(*self.__args, **self.__kwargs)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/pool.py", line 342, in _handle_tasks
put(task)
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
线程2中的异常: 回溯(最近一次呼叫最后一次): 文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py”,第808行,在bootstrap\u内部 self.run() 文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py”,第761行,运行中 自我目标(*自我参数,**自我参数) 文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/pool.py”,第342行,在任务处理中 放置(任务) PicklingError:无法pickle:属性查找\内置\函数失败 Chan1和Chan2是我的信号阵列,我试图从中过滤掉一些噪音。
我不熟悉多处理,所以如果这是一个愚蠢的错误,我向您道歉。我将这个问题标记为dup of,总结一下:您不能对函数进行pickle,当您将
wrapper()
传递到
Pool().map()
时,这就是您要做的。要pickle函数,需要使用copy_reg,如下所示

“不能对类、函数和方法进行pickle——如果对对象进行pickle,则对象的类不会被pickle,而只是一个标识其所属类的字符串。”(cf)


我不使用自定义类,这就是他的问题所在(至少据我所知)

不,他的问题是,他试图对一个实例方法进行pickle,该方法与函数比较接近,因为两者都不能被pickle。解决这个问题的办法也应该对你有用

虽然我没有测试它


HTH

我不使用自定义类,这就是他的问题所在(至少据我所知)@user2352742问题在于并非所有对象都是可拾取的。哪些对象不可拾取?你能告诉我更多关于Chan1/Chan2的定义吗?它们是什么?通道1和通道2只是一个数字数组。它们来自一系列二进制数据文件,然后被修剪为2的幂次方。您可以pickle顶级函数;多处理所要做的就是pickle一个表示名称的字符串。我很确定酸洗错误来自尝试酸洗
两个通道,而不是
包装器。有点难说,因为回溯没有帮助。或者实际上,酸洗错误可能来自尝试将
s.Noise\u Reduction
对象通过管道运回。当然是这样。我的感觉是,确实是包装器失败了(考虑到引发的异常),尽管您可能认为
s.Noise_Reduction
是函数中使其不可访问的东西。有没有简单的方法来pickle几个函数?降噪还调用其他几种方法来降低信号中的噪声。我只是为了提高效率而选择了错误的路径吗?好吧,我认为,不管真正的错误是什么,你的问题是你试图在进程之间移动算法,而不是只移动你希望算法工作的数据集。由于算法在程序的生命周期内不会发生变化,因此您可以轻松地将进程与它们进行实例关联,并且只获取要在它们之间进行pickle的数据。