不能泡菜功能

时间:2014-03-03 21:35:28

标签: 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)
    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是我信号的数组,我试图从每个信号中滤除一些噪音。 我是多处理的新手,所以如果这是一个愚蠢的错误,我道歉

1 个答案:

答案 0 :(得分:2)

我将此问题标记为that Q/A的副本,并总结一下:您无法挑选功能,这就是您将wrapper()传递给{{1}时要尝试做的事情}。要使用pickle函数,您需要使用copy_reg,如example所示。

  

“不能腌制类,函数和方法 - 如果你挑选一个对象,那么对象的类就不会被pickle,只是一个标识它所属的类的字符串。”(cf doc

  

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

不,他的问题是他试图挑选一个实例方法,它相对接近一个函数,因为它们都不能被腌制。 A的解决方法也应该对你有用。

虽然我没有测试它......

HTH