2017-05-04 29 views
0

2つの別々のプロセスで2つのループを同時に実行しようとしています。最初のプロセスはグローバル変数を変更します。2つのプロセス間でグローバル変数を共有

私の問題は、最初のプロセスが完了する前にグローバル変数が変更されないため、2番目のプロセスが正しく応答しないということです。

これは私のコードです:

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に変換する必要があります - 'Value'は論理型を取っていません。そして、それは単純化し過ぎています。スレッドで実行されているものが_not_ pythonコード、つまりネイティブコードを持つネイティブエクステンションまたはサードパーティライブラリである場合、スレッドは常に優先されます。複数のプロセスでは、各プロセスが独自のGILを持つため、CPUバインドされたPythonコードを並列に実行できます。 – danny

関連する問題