Python 带有Apply_async()的并行装饰器

Python 带有Apply_async()的并行装饰器,python,multiprocessing,Python,Multiprocessing,我希望在Python中使用多处理,以便在k时间内处理高计算成本函数,并在列表中收集返回的结果。让我像这样展示我的功能 def _heavy_func(value): a, b = 0, 1 for item in range(value): a, b = b, a + b import time time.sleep(1.3) return a from functools impo

我希望在Python中使用多处理,以便在
k
时间内处理高计算成本函数,并在列表中收集返回的结果。让我像这样展示我的功能

def _heavy_func(value):
        a, b = 0, 1
        for item in range(value):
                a, b = b, a + b
        import time
        time.sleep(1.3)
        return a
from functools import wraps
from multiprocessing import Pool

def parallel_decor(n_procs=None):
    def _parallel_decor(function):
        @wraps(function)
        def __parallel_decor(iterable_values, *args, **kwargs):
            args = list(args)
            p = Pool(n_procs)
            result = [p.apply_async(function, args=[value]+args, kwds=kwargs) for value in iterable_values]
            p.close()
            try:
                return [r.get() for r in result]
            except KeyError:
                return []
        return __parallel_decor
    return _parallel_decor

@parallel_decor(5) # 5 processes
def _heavy_func(value):
        a, b = 0, 1
        for item in range(value):
                a, b = b, a + b
        import time
        time.sleep(1.3)
        return a

def main():
    _heavy_func(range(12))

if __name__ == "__main__":
    main()
然后,我调用
\u heavy\u func
以显示非并行方式

In [1]: print [ _square_and_offset(i) for i in range(12)]
它的性能非常好

[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
IPython CPU timings (estimated):
  User   :      13.01 s.
  System :       0.00 s.
Wall time:      13.01 s.
现在,我已经将面向装饰器的并行性融入到我的函数中,如

def _heavy_func(value):
        a, b = 0, 1
        for item in range(value):
                a, b = b, a + b
        import time
        time.sleep(1.3)
        return a
from functools import wraps
from multiprocessing import Pool

def parallel_decor(n_procs=None):
    def _parallel_decor(function):
        @wraps(function)
        def __parallel_decor(iterable_values, *args, **kwargs):
            args = list(args)
            p = Pool(n_procs)
            result = [p.apply_async(function, args=[value]+args, kwds=kwargs) for value in iterable_values]
            p.close()
            try:
                return [r.get() for r in result]
            except KeyError:
                return []
        return __parallel_decor
    return _parallel_decor

@parallel_decor(5) # 5 processes
def _heavy_func(value):
        a, b = 0, 1
        for item in range(value):
                a, b = b, a + b
        import time
        time.sleep(1.3)
        return a

def main():
    _heavy_func(range(12))

if __name__ == "__main__":
    main()
不幸的是,我犯了一个错误

---------------------------------------------------------------------------
PicklingError                             Traceback (most recent call last)
C:\Users\Laptop\Desktop\sp_parallel.py in <module>()
     30 
     31 if __name__ == "__main__":
---> 32         main()

C:\Users\Laptop\Desktop\sp_parallel.py in main()
     27 
     28 def main():
---> 29         _heavy_func(range(12))
     30 
     31 if __name__ == "__main__":

C:\Users\Laptop\Desktop\sp_parallel.py in __parallel_decor(iterable_values, *args, **kwargs)
     11                         p.close()
     12                         try:
---> 13                                 return [r.get() for r in result]
     14                         except KeyError:
     15                                 return []

C:\Anaconda\lib\multiprocessing\pool.pyc in get(self, timeout)
    565             return self._value
    566         else:
--> 567             raise self._value
    568 
    569     def _set(self, i, obj):

PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
---------------------------------------------------------------------------
PicklingError回溯(最近一次调用上次)
C:\Users\Laptop\Desktop\sp\u parallel.py in()
30
31如果名称=“\uuuuu main\uuuuuuu”:
--->32主要内容()
C:\Users\Laptop\Desktop\sp_parallel.py在main()中
27
28 def main():
--->29重功能(范围(12))
30
31如果名称=“\uuuuu main\uuuuuuu”:
C:\Users\Laptop\Desktop\sp_parallel.py in_uuuparallel_decor(iterable_值,*args,**kwargs)
晚上11点结束
12尝试:
--->13返回[r.get()表示结果中的r]
14除按键错误外:
15返回[]
get中的C:\Anaconda\lib\multiprocessing\pool.pyc(self,超时)
565返回自身值
566其他:
-->567提高自我价值
568
569 def_装置(自、i、obj):
PicklingError:无法pickle:属性查找\内置\函数失败
根据,在模块的顶层定义了以下类型的函数。我的问题是,是否有机会修改我的方法,在装饰器中使用pickle函数

提前谢谢