반응형
다음과 같이 실행할 때 :
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
반응형
'파이썬' 카테고리의 다른 글
파이썬의 튜플에서 정수를 어떻게 얻습니까? (0) | 2020.11.16 |
---|---|
파이썬 클래스의 모든 인스턴스 인쇄 (0) | 2020.11.16 |
파이썬 오프셋 롤 포워드 후 월 오프셋 추가 후 pandas 범위를 벗어난 나노초 타임 스탬프 (0) | 2020.11.15 |
파이썬 Python에서 null 개체 참조 (0) | 2020.11.15 |
파이썬에서 동적 (매개 변수화 된) 단위 테스트를 어떻게 생성합니까? (0) | 2020.11.15 |
댓글