2017-11-06 15 views
1

2つのプロセスを同時に実行したいです。 1は1秒ごとに印刷を続け、もう1つは入力を要求し、入力が 'Y'であれば、最初のプロセスは 'a'の印刷を停止します。私は、Pythonにかなり新しいですし、私はそれを把握することはできません...Pythonでマルチプロセッシング時に入力を使用できません

これは私がこれまでに思い付いたものです:

from multiprocessing import Process 
import time 

go = True 

def loop_a(): 
    global go 

    while go == True: 
     time.sleep(1) 
     print("a") 

def loop_b(): 
    global go 
    text = input('Y/N?') 

    if text == 'Y': 
     go = False 

if __name__ == '__main__': 
    Process(target=loop_a).start() 
    Process(target=loop_b).start() 

これは私が取得していますエラーメッセージです:

Process Process-2: 
Traceback (most recent call last): 
    File "C:\Users\Tip\AppData\Local\Programs\Python\Python36\lib\multiprocessing\process.py", line 249, in _bootstrap 
    self.run() 
    File "C:\Users\Tip\AppData\Local\Programs\Python\Python36\lib\multiprocessing\process.py", line 93, in run 
    self._target(*self._args, **self._kwargs) 
    File "F:\ProgrammingTK\PROGproject\test.py", line 15, in loop_b 
    text = input('Y/N?') 
EOFError: EOF when reading a line 
+0

'multiprocessing'モジュールが意図的にそれが作成したすべてのプロセスの標準入力をクローズ:どちら実際に受信するように、それ以外の場合は不定になりますが任意の入力。メインプログラムで入力ループを実行することでこれを修正できますが、コードはまだ動作しません。グローバルな 'go'はプロセス間で共有されません。 'multiprocessing.Value'や、プロセス間で明示的に共有される他のさまざまなメカニズムのいずれかを使用する必要があります。 – jasonharper

答えて

0

拡大表示jasonharperさんのコメントは間違いありません。

夫婦の問題はgo変数は、プロセス間で共有ないある

  1. があります。 Jasonが提案したように、Managerのようなものをmultiprocessingに使用すると、複数のプロセス間で値を共有できます。技術的には、その変数goは各プロセスにコピーされますが、それらのプロセス間では共有されないため、あるプロセスの変更はもう一方のプロセスによって変更されません。
  2. もう一度言及したように、input(..)をプログラムのメインスレッドにプルする必要があります。また、2.7の場合は、raw_input(..)を使用する必要があります。
  3. また、フラグを1回確認してから終了すると、BrokenPipeErrorにぶつかる可能性が高くなります。それを取り込む

、あなたはこのような何か試すことができます。

from multiprocessing import Process, Manager 
import time 


def loop_a(go): 
    while True: 
     # run forever and print out the msg if the flag is set 
     time.sleep(1) 
     if go.value: 
      print("a") 

if __name__ == '__main__': 
    # shared value flag 
    manager = Manager() 
    go_flag = manager.Value('flag', True) 

    # other process that is printing 
    Process(target=loop_a, args=(go_flag,)).start() 

    # normal main thread; toggle on and off the other process 
    while True: 
     text = input('Stop Y/N?') 
     if text == 'Y': 
      go_flag.value = False 
      print("Changed the flag {}".format(go_flag.value)) 
     else: 
      go_flag.value = True 
      print("Changed the flag {}".format(go_flag.value)) 
関連する問題