내가 다음과 같은 것을 실행할 때 :
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에서 같은 종류의 문제를 다루는 게시물을 보았지만 충분히 명확하지 않았습니다.
IPython.Parallel
있었지만 객체를 노드로 푸시하면 문제를 해결할 수 있습니다. 멀티 프로세싱 으로이 문제를 해결하는 것은 꽤 성가신 것 같습니다.
calculate
피클 가능하므로 1) calculate
인스턴스 를 복사하는 생성자로 함수 객체를 만든 다음 2)이 함수 객체의 인스턴스를 Pool
의 map
메소드에 전달하면 해결할 수있는 것처럼 보입니다 . 아니?
multiprocessing
모듈 의 일부 제한 사항은 크로스 플랫폼 구현이라는 목표 fork(2)
와 Windows에서 비슷한 시스템 호출 이 없기 때문입니다 . Win32 지원에 신경 쓰지 않으면 프로세스 기반의 간단한 해결 방법이있을 수 있습니다. 대신 프로세스의 스레드를 사용할 수 있도록 준비하는 경우 또는, 당신은 대체 할 수 있습니다 from multiprocessing import Pool
로 from multiprocessing.pool import ThreadPool as Pool
.