2012-09-07 3 views
1

수 없습니다. 이유는 확실하지 않지만 어제 제가 작성한 일부 다중 처리 코드를 테스트하고 있었고 정상적으로 작동하고있었습니다. 내가 코드를 다시 검사 할 때 그리고 오늘, 그 날이 오류를 줄 것이다 :Python 3.2 Multiprocessing NotImplementedError : 풀 객체는

Exception in thread Thread-5: 
Traceback (most recent call last): 
    File "C:\Python32\lib hreading.py", line 740, in _bootstrap_inner 
    self.run() 
    File "C:\Python32\lib hreading.py", line 693, in run 
    self._target(*self._args, **self._kwargs) 
    File "C:\Python32\lib\multiprocessing\pool.py", line 342, in _handle_tasks 
    put(task) 
    File "C:\Python32\lib\multiprocessing\pool.py", line 439, in __reduce__ 
    'pool objects cannot be passed between processes or pickled' 
NotImplementedError: pool objects cannot be passed between processes or pickled 

다음과 같이 내 코드의 구조는 간다 :
을 나는,이 개 모듈이 A.py 말을하고 B.py. *
* A.py는 A라는 클래스에 정의되어 있습니다.
* B.py는 클래스 B를가집니다.
* 클래스 A에는 다중 처리 풀이 속성 중 하나입니다. 수영장은 A.__init__()에 정의되어 있지만, 다른 방법에 사용되는 *
- 실행() A.run()에서
* 내가 (objBList라는 목록에서 수집) 클래스 B의 일부 개체의 일부 속성을 설정 한 다음 내가 pool.map(processB, objBList)를 사용
* processB()는 유일한 매개 변수 (B의 인스턴스)로 수신하고 B.runInput()
*을 호출하는 모듈 함수입니다. 오류는 pool.map() 행에서 발생합니다. A.py에서 기본적으로

:

class A: 
    def __init__(self): 
     self.pool = multiprocessing.Pool(7) 
    def run(self): 
     for b in objBList: 
     b.inputs = something 
     result = self.pool.map(processB, objBList) 
     return list(result) 
def processB(objB): 
    objB.runInputs() 

및 B.py의 : BTW

class B: 
    def runInputs(self): 
     do_something() 

, 나는 때문에 멀티 프로세싱 방식의 processB() 모듈의 기능을 사용하도록 강요하고 있습니다 Windows의 경우에서 작동합니다.

또한 오류가 발생했습니다. 그 풀을 절대로 뺄 수는 없습니다. 자식 프로세스를 보내지 않으려 고하면서 코드의 일부를 참조하지 말아야합니다. 풀 개체.

아이디어가 있으십니까?

(PS : 나는 또한 내가 컴퓨터가 예기치 않게 다시 시작이 기능을 테스트 한 이틀 사이에 그에서 언급해야한다 - 아마도 윈도우 업데이트를 설치 한 후.)

+1

문제를 나타내는 실행 가능한 예제를 게시하십시오. –

답변

0

아마도 당신의 클래스 B 객체를 A에 대한 참조를 포함 예.

+0

예, 실제로! 그게 정확히 무슨 일이야. 나는 A의 인스턴스를 B의 __init__에 전달하고 그 두 가지를 그런 식으로 연결했다. 나는 수영장이 __init __ ... 동안 초기화되지 않는 것이 좋을 것이라고 생각한다. – Gabriel