2017-05-04 3 views
0

두 개의 다른 프로세스에서 두 개의 루프를 동시에 실행하려고합니다. 첫 번째 프로세스는 다른 프로세스가 결정을 내리는 데 사용하는 전역 변수를 수정합니다.두 프로세스간에 글로벌 변수 공유

제 문제는 전역 변수가 첫 번째 프로세스가 끝나기 전에 수정되지 않아 두 번째 프로세스가 제대로 응답하지 않는다는 것입니다.

flag = [False] 
def loop1(): 
    x = 0 
    while (x<10): 
    x = x + 1 
    read = input("Enter 0 or 1") 
    if read == 0: 
     flag[0] = False 
    else: 
     flag[0] = True 
def loop2(): 
    z = 0 
    while (z<100): 
    z = z + 1 
    if flag[0] == False: 
     # do something 
    else: 
     # do other thing 
    time.sleep(1) 
if __name__ == '__main__': 
    Process(target = loop1).start() 
    Process(target = loop2).start() 
+0

https://docs.python.org/2/library/multiprocessing.html#sharing-state-between-processes –

답변

1

프로세스 상태를 공유하지 않는 :

내 코드입니다. multiprocessing.Queue과 같은 공유 대기열을 사용해야하고 두 프로세스에 대기열 객체를 인자로주고 대기열을 통해 플래그 변수를 전달해야합니다.

multiprocessing 대신에 threading과 프로세스의 주소 공간을 공유하고 동일한 (a에 대한 참조) 변수를 사용할 수있는 스레드를 사용하십시오.

두 가지 방법 모두 장단점이 있으므로 참조 용으로 SO에서 다중 처리 대 스레딩을 검색하십시오.

스레딩 경우

, 플래그 객체는 클래스에서, 예를 들어, 그것을 사용하는 모든 양산 스레드를 포함하는 개체에 바인딩해야합니다 :

from __future__ import print_function 
from threading import Thread 
import time 


class State(object): 

    def __init__(self): 
     self.flag = False 
     self.consumer_thread = Thread(target=self.check_flag) 
     self.consumer_thread.daemon = True 
     self.consumer_thread.start() 

    def read_input(self): 
     while True: 
      _read = input() 
      if _read == 0: 
       self.flag = False 
      else: 
       self.flag = True 
      time.sleep(1) 

    def check_flag(self): 
     while True: 
      if self.flag is True: 
       print("Is true") 
       # do stuff 
      time.sleep(1) 

if __name__ == "__main__": 
    state = State() 
    state.read_input() 

두 스레드 (메인 스레드 + 소비자 스레드)는 동일한 객체 인 self.flag을 참조하며, 클래스 객체의 주소 공간 인 self을 공유합니다.

+0

왜 '다중 처리. 값'이 아닌가요? 프로그램이 CPU 바인딩되지 않은 한 스레드를 사용하는 것이 좋습니다 (구현 현명한). 그러나 CPU가 제한되어 있으면 스레드가 아닌 프로세스를 사용해야합니다. –

+0

이것을 사용할 수는 있지만 정수에서 bool로 변환해야합니다. '값'은 부울 유형을 사용하지 않습니다. 그리고 그것은 지나치게 단순화 된 것입니다. 스레드에서 실행되고있는 것이 파이썬 코드가 아닌 경우, 즉 네이티브 확장 또는 네이티브 코드가 포함 된 타사 라이브러리 인 경우 스레드는 항상 CPU 바운드 또는 아니요를 선호합니다. 여러 프로세스를 사용하면 각 프로세스가 자체 GIL을 갖기 때문에 CPU 바인딩 파이썬 코드를 병렬로 실행할 수 있습니다. – danny