2017-10-18 7 views
2

나는 다음과 같은 다중 코드를 실행하려고. 속성 finishedrun 메서드에서 True으로 설정하고 출력 executedrun 메서드가 실행되었음을 나타냅니다. 그리고 run 메서드에서 self.finished=True 직후에 print(self.finished) 줄을 추가하면 출력은 True이됩니다. 다중 처리가 완료된 후 클래스 속성 finished이 변경되는 이유는 무엇입니까?멀티 유지하지 결과

감사합니다.

+0

t.finish는 주 프로세스가 아닌 다른 프로세스에서 업데이트됩니다. 참조 : https://docs.python.org/3/library/multiprocessing.html#sharing-state-between-processes – gammazero

답변

0

이렇게하면 프로세스간에 완료 값을 공유 할 수 있습니다. multiprocessing.Value을 사용하여 공유 메모리를 사용하여 공유 객체를 만듭니다.

from multiprocessing import Process, Value 

class test(Process): 
    def __init__(self, name, fin): 
     Process.__init__(self) 
     self.name = name 
     self.finished = fin 

    def run(self): 
     print("executed") 
     self.finished.value = True 

test_list = [] 
test_list.append(test('first', Value('b', False))) 
test_list.append(test('second', Value('b', False))) 

for t in test_list: 
    t.start() 

for t in test_list: 
    t.join() 

for t in test_list: 
    print(bool(t.finished.value)) 
+0

감사합니다. – Craig

1

self.finished = True은 다른 프로세스에서 실행되며 해당 프로세스의 변수 만 변경하지만 주 프로세스에서 값을 인쇄합니다. 공유되는 변수가 필요합니다.

from multiprocessing import Process,Value 
from ctypes import c_bool 

class test(Process): 
    def __init__(self,name): 
     super().__init__() 
     self.name = name 
     self._finished = Value(c_bool,False) 

    def run(self): 
     print(self.name,'executed') 
     self._finished.value = True 

    @property 
    def finished(self): 
     return self._finished.value 

if __name__ == '__main__': 
    test_list = [test('first'), 
       test('second')] 

    for t in test_list: 
     t.start() 

    for t in test_list: 
     t.join() 

    for t in test_list: 
     print(t.finished)