2017-11-06 1 views
1

Ich möchte 2 Prozesse zur gleichen Zeit ausführen. 1 druckt jede Sekunde "a" und der andere fragt nach einer Eingabe und wenn die Eingabe "Y" ist, hört der erste Prozess auf, "a" zu drucken. Ich bin ziemlich neu in Python und ich kann es nicht herausgefunden ...Konnte Eingabe nicht verwenden, wenn ich in Python multiplizieren

Dies ist, was ich mit so weit kam:

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() 

Dies ist die Fehlermeldung erhalte ich:

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

Das 'multiprocessing' Modul schließt absichtlich die Standardeingabe aller Prozesse schafft: es sonst unbestimmt sein würde, wie zu dem man tatsächlich erhalten jede Eingabe. Sie könnten dies beheben, indem Sie die Eingangsschleife im Hauptprogramm ausführen, aber Ihr Code würde immer noch nicht funktionieren - Ihr globales 'go' wird NICHT zwischen Prozessen geteilt. Sie müssten 'multiprocessing.Value' oder einen der verschiedenen anderen Mechanismen verwenden, die explizit zwischen Prozessen ausgetauscht werden. – jasonharper

Antwort

0

Erweitern nach jasonharper Kommentar, wie er richtig ist.

Es gibt ein paar

  1. Fragen Die go Variable ist nicht unter den Prozessen geteilt. Wie Jason vorgeschlagen hat, können Sie etwas wie Manager in multiprocessing verwenden, um einen Wert unter mehreren Prozessen zu teilen. Technisch wird diese go Variable in jeden Prozess kopiert, aber sie wird nicht zwischen ihnen geteilt, so dass eine Änderung in einem Prozess von dem anderen nicht gesehen wird.
  2. Wie schon erwähnt, müssen Sie die input(..) in den Hauptthread des Programms ziehen. Auch wenn Sie auf 2.7 sind, müssen Sie raw_input(..) verwenden.
  3. Wenn Sie nur einmal die Flagge überprüfen und dann beenden, werden Sie wahrscheinlich eine BrokenPipeError treffen.

nehmen, dass in, können Sie so etwas wie dies versuchen:

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)) 
Verwandte Themen