2017-03-16 5 views
0

Ich möchte einen Prozess haben, der die RPi-Eingabe kontinuierlich überwacht und eine Variable (ich habe eine Warteschlange gewählt) auf True oder False setzt, um den entprellten Wert widerzuspiegeln. Ein anderer Prozess wird dann ein Bild (aus einem Stream) erfassen. Ich habe einen Code geschrieben, nur um zu überprüfen, dass ich Multiprocessing und Signalisierung (die Warteschlange) ok arbeiten kann (ich bin ein Amature Coder ...).Python 3: Multiprocessing, EOFError: EOF beim Lesen einer Zeile

Alles funktioniert gut mit Threading, aber Multiprocessing gibt einen seltsamen Fehler. Speziell 'Multiprocessing, EOFError: EOF beim Lesen einer Zeile'. Code Ausgänge: -

this computer has the following number of CPU's 6 
OK, started thread on separate processor, now we monitor variable 
enter something, True is the key word: 
Process Process-1: 
Traceback (most recent call last): 
    File "c:\Python34\lib\multiprocessing\process.py", line 254, in _bootstrap 
    self.run() 
    File "c:\Python34\lib\multiprocessing\process.py", line 93, in run 
    self._target(*self._args, **self._kwargs) 
    File "C:\Users\Peter\Documents\NetBeansProjects\test_area\src\test4.py", line 16, in Wait4InputIsTrue 
    ValueIs = input("enter something, True is the key word: ") 
EOFError: EOF when reading a line 

Dieses Modul überwacht die 'Port' (ich bin mit der Tastatur als Eingabe):

#test4.py 
from time import sleep 
from multiprocessing import Lock 

def Wait4InputIsTrue(TheVar, TheLock): 
    while True: 
     sleep(0.2) 
     TheLock.acquire() 
     #try: 
     ValueIs = input("enter something, True is the key word: ") 
     #except: 
     # ValueIs = False 
     if ValueIs == "True": 
      TheVar.put(True) 
      print("changed TheVar to True") 
     TheLock.release() 

Dieses Modul den Status überwacht, und wirkt auf sie:

Beachten Sie, dass ich versucht habe, einen Versuch hinzuzufügen: zu der Eingabeanweisung in test4.py, in diesem Fall druckt es "geben Sie etwas ein, Wahr ist das Schlüsselwort:" unbegrenzt, ohne ein cr.

Ich habe Lock-in wilden Versuch, es zu beheben, macht keinen Unterschied

jemand eine Idee, warum dies geschieht?

Antwort

0

Ihr Problem kann auf eine einfachere Skript gekocht werden:

import multiprocessing as mp 
import sys 

def worker(): 
    print("Got", repr(sys.stdin.read(1))) 

if __name__ == "__main__": 
    process = mp.Process(target=worker) 
    process.start() 
    process.join() 

Wenn er gestartet wird, produziert sie

$ python3 i.py 
Got '' 

Null-Bytes Lesen bedeutet, dass das Rohr geschlossen und input(..) Wendungen, die in eine EOFError Ausnahme .

Das Modul multiprocessing lässt Sie nicht lesen stdin. Das macht im Allgemeinen Sinn, weil das Mischen von stdin Lesern von mehreren Kindern ein riskantes Geschäft ist. In der Tat, in die Umsetzung zu graben, setzt multiprocessing/process.py ausdrücklich stdin-devnull:

   sys.stdin.close() 
       sys.stdin = open(os.devnull) 

Wenn Sie nur stdin für den Test verwenden, dann ist die Lösung einfach: Tu das nicht! Wenn Sie wirklich Benutzereingaben benötigen, ist das Leben ein bisschen schwieriger. Sie können zusätzliche Warteschlangen und Code im übergeordneten Element verwenden, um Benutzer anzurufen und Eingaben zu erhalten.