2

Ich habe einen Hintergrund Thread, der gelegentlich Tastatureingabe benötigt. Der Haupt-Thread liest jedoch auch Eingaben von der Tastatur. Wenn ich input() rufe, erhält der Hauptfaden die Eingabe. Ich habe versucht, Schlösser zu benutzen, aber sie funktionieren nicht für mich.Wie liest man Tastatureingaben von einem Hintergrundthread in Python?

Hauptprozess (nur ein Teil des Codes):

def smth(aff): 
    af = aff 

lock = threading.Lock() 

print(lock) 

Peer.setlock(lock) 

while True: 
    lock.acquire(blocking=True, timeout=-1) 
    inp = input() 
    parse(inp) 
    lock.release() 

Thema Code:

global lock 

def setlock(j): 
    print("Setting lock ", j) 
    global lock 
    lock = j 

print("Lock status: ", lock.locked()) 
success = lock.acquire(blocking=True, timeout=-1) 
print(success) 
print("You are recieving a file, type y to confirm saving:") 
print(lock) 

if input() == "y": 
    path = "" 
    print("Input path:") 
    path = input() 
    if os.path.isfile(path): 
     print("File already exists. Type y to confirm:") 
     if not input()=="y": 
      return 
    handle = open(path, "wb") 
    filewriters[transferID] = filewg(handle, numberOfPackets) 
    filewriters[transferID].send(None) 
lock.release() 
print(lock) 

Der gesamte Code befindet here.

Ich schrieb nur ein weiteres minimal Beispiel und Schlösser scheinen hier zu arbeiten: Import

lock = threading.Lock() 

def th(): 
    while True: 
     lock.acquire(blocking=True, timeout=-1) 
     print("Thread prints ", input()) 
     lock.release() 

tic = threading.Thread(target=th) 

tic.start() 

while True: 
    lock.acquire(blocking=True, timeout=-1) 
    print("Main prints ", input()) 
    lock.release() 
+0

Versuchen Sie, ein [minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) des Problems zu veröffentlichen. Ihr Code sieht merkwürdig aus, da außer der Sperre keine Threading-Konstrukte vorhanden sind. Offensichtlich haben Sie einige wichtige Informationen weggelassen. – CAB

+0

Der gesamte Code befindet sich [hier] (https://github.com/Creator/P2P). – Creator

Antwort

2

Das unmittelbare Problem ist, dass input() in den Haupt-Thread blockiert und wartet auf die Eingabe mit der gehaltenen Sperre Threading. Egal, ob Ihr Hintergrund-Thread versucht, eine Eingabe zu erhalten, der Haupt-Thread hält bereits die Sperre und wartet auf die Eingabe, und die erste Eingabe geht an den Haupt-Thread.

Danach ruft der Hauptthread sofort wieder release() und dann acquire() auf. Leider threading.Lock macht keine Garantien über die Fairness .. auch wenn der Hintergrund-Thread in warte, ist es möglich, dass der nachfolgende Thread zuerst erfolgreich ist, "springt die Zeile" auf dem Hintergrund-Thread.

Gehen Sie zurück und schauen Sie sich an, was Sie im "großen Bild" zu tun versuchen. Sie haben eine Ressource (den Terminal-Eingabestream), die Sie versuchen, abhängig vom Kontext der Programmausführung an zwei verschiedene Speicherorte zu verweisen. Ich würde über ein Modell nachdenken, wo nur ein Thread die input() tut, aber Sie schauen auf den globalen Zustand, um zu sehen, was danach zu tun ist.

+0

Ich habe über eine Option nachgedacht, bei der Threads Anforderungen an den Hauptthread über eine Warteschlange oder etwas Ähnliches senden. Der Haupttext antwortet mit der Eingabe. – Creator

+0

Der Vorschlag, den ich oben gemacht habe, funktioniert, obwohl es sich extrem hacky anfühlt. – Creator

Verwandte Themen