2012-11-02 5 views
0

pp 모듈을 사용할 때 'test'개체의 dict 'params'를 업데이트 할 수 없습니다. 이것이 왜 일어날 지 누가 알 수 있습니까? 그냥 코드를 보면 :Parallel Python 모듈을 사용할 때 'dict'개체를 업데이트 할 수 없습니다.

import pp 

class test(object): 
    params = {'n': None} 
    dic2 = {} 
    n = None 

    def __init__(self, i): 
     #won't change 
     self.params['n'] = i 
     #changed 
     self.n = i 
     self.dic2 = {i: i} 

    def run(self): 
     print self.n, self.params, self.dic2 

job_server = pp.Server() 

jobs = [] 

for i in xrange(10): 
    t = test(i) 
    #won't change 
    t.params['n'] = i 
    #changed 
    t.n = i 
    t.run() 
    jobs.append(job_server.submit(t.run)) 

[job() for job in jobs] 

결과 : PP를 사용하는 경우 우리가 볼 수있는 바와 같이, "PARAMS는 [ 'N']"

0 {'n': 0} {0: 0} 
1 {'n': 1} {1: 1} 
2 {'n': 2} {2: 2} 
3 {'n': 3} {3: 3} 
4 {'n': 4} {4: 4} 
0 {'n': None} {0: 0} 
1 {'n': None} {1: 1} 
2 {'n': None} {2: 2} 
3 {'n': None} {3: 3} 
4 {'n': None} {4: 4} 

를 업데이트 할 수 없습니다. 그것은 이상한 행동입니다. 어떻게 이런 일이 일어날 수 있겠습니까?

답변

3

이것은 다중 처리 모듈의 공통적 인 함정입니다.

당신이 job_server.submit(t.run) 같은 통화를 할

는, 객체 t는, 새로운 프로세스에 unpickled 전송, 절인되어 run가 실행되고 반환 값은 주요 공정 및 unpickled로 다시 전송, 절인된다.

이제 클래스 피클 링은 실제로 지원되지 않습니다 (here 참조). pickle은 이름을 pickle하고 unpickle 할 때 모듈을 다시 import하여 클래스 객체를 얻습니다.

사용중인 변수가 클래스 변수이므로 모듈을 다시 가져올 때 다시 초기화됩니다. 함수의 속성에서도 마찬가지입니다.

이러한 변수의 값을 유지하려면 인스턴스 변수를 만들어야합니다.

관련 문제