본문 바로가기
파이썬

파이썬 다중 처리 : 클래스에 정의 된 함수에서 Pool.map을 사용하는 방법은 무엇입니까?

by º기록 2020. 11. 15.
반응형

다음과 같이 실행할 때 :

from multiprocessing import Pool

p = Pool(5)
def f(x):
     return x*x

p.map(f, [1,2,3])

잘 작동합니다. 그러나 이것을 클래스의 함수로 넣으십시오.

class calculate(object):
    def run(self):
        def f(x):
            return x*x

        p = Pool()
        return p.map(f, [1,2,3])

cl = calculate()
print cl.run()

다음과 같은 오류가 발생합니다.

Exception in thread Thread-1:
Traceback (most recent call last):
  File "/sw/lib/python2.6/threading.py", line 532, in __bootstrap_inner
    self.run()
  File "/sw/lib/python2.6/threading.py", line 484, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/sw/lib/python2.6/multiprocessing/pool.py", line 225, in _handle_tasks
    put(task)
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed

같은 종류의 문제를 다루는 Alex Martelli의 게시물을 보았지만 충분히 명시 적이 지 않았습니다.

 

해결 방법

 

또한 pool.map이 허용 할 수있는 기능의 종류에 대한 제한으로 인해 짜증이났습니다. 나는 이것을 우회하기 위해 다음과 같이 썼다. parmap을 재귀 적으로 사용하더라도 작동하는 것처럼 보입니다.

from multiprocessing import Process, Pipe
from itertools import izip

def spawn(f):
    def fun(pipe, x):
        pipe.send(f(x))
        pipe.close()
    return fun

def parmap(f, X):
    pipe = [Pipe() for x in X]
    proc = [Process(target=spawn(f), args=(c, x)) for x, (p, c) in izip(X, pipe)]
    [p.start() for p in proc]
    [p.join() for p in proc]
    return [p.recv() for (p, c) in pipe]

if __name__ == '__main__':
    print parmap(lambda x: x**x, range(1, 5))

 

참조 페이지 https://stackoverflow.com/questions/3288595

 

 

반응형

댓글