无法序列化函数
我正在尝试通过一点多进程来加快我的计算速度。
我想使用池子里的工作进程。
在我的代码顶部,我有
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
Chan1和Chan2是我的信号数组,我正在尝试过滤掉一些噪声。
我对多进程还很陌生,如果这是个愚蠢的错误,我先说声抱歉。
2 个回答
0
我遇到了一个类似的错误——
这个问题是通过更改脚本运行的参数解决的。
当我在 PyCharm 中使用控制台选项运行时,出现了和例子里一样的错误,提示找不到函数的属性,出现了“序列化错误”。
但是当我使用运行或调试模式时,一切都正常——
我猜测这两种方式加载函数的方式不一样。
5
我把这个问题标记为和那个问答重复,简单来说就是:你不能把函数“腌制”(也就是序列化),而你在把wrapper()
传给Pool().map()
时,正是在尝试这么做。要想腌制函数,你需要使用copy_reg,具体可以参考这个例子。
“类、函数和方法是不能被腌制的——如果你腌制一个对象,那个对象的类不会被腌制,只会有一个字符串来标识它属于哪个类。”(参见文档)
- http://docs.python.org/2/library/copy_reg.html?highlight=copyreg
- http://bytes.com/topic/python/answers/552476-why-cant-you-pickle-instancemethods
我不使用自定义类,这就是他的问题所在(至少我觉得是这样)
其实,他的问题是他试图腌制一个实例方法,这个方法和函数比较接近,因为它们都不能被腌制。而解决方案A也应该对你有用。
不过我没有测试过这个……