nonblocking input

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ich hab mal nach non-blocking input gesucht... Neben Lösungen, die pygame, tkinter, select/termios nutzten habe ich eine einfache Lösung bei http://forums.xkcd.com/viewtopic.php?f=11&t=99890 gefunden.

Hab nur ein paar Anpassungen gemacht:

Code: Alles auswählen

import thread
import time

def input_thread(input_buffer):
    char = raw_input()
    input_buffer.append(char)

def main():
    input_buffer = []
    thread.start_new_thread(input_thread, (input_buffer,))
    for i in xrange(100):
        print i
        time.sleep(.5)
        if input_buffer:
            print input_buffer.pop(0)

main()
Was meint ihr?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

@jens: Ich meine das man `thread` jetzt schon *sehr lange* nicht mehr verwenden sollte.

Dann ist `char` für eine Zeichenkette mit in der Regel mehr als einem Zeichen ein falscher Name.

Eine Liste als Queue ist ineffizient und ob das nun threadsicher ist oder nicht hängt wahrscheinlich von der Python-Implementierung ab. Für so etwas gibt es aber `Queue.Queue` was sowohl effizient als auch threadsicher ist.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Danke!
Hab nun Queue genutzt:

Code: Alles auswählen

import sys
import thread
import time
import Queue

def input_thread(input_queue):
    while True:
        input_queue.put(sys.stdin.read(1))

def foobar():
    input_queue = Queue.Queue()
    thread.start_new_thread(input_thread, (input_queue,))

    last_update = time.time()
    while True:

        if time.time()-last_update>0.5:
            sys.stdout.write(".")
            last_update = time.time()

        if not input_queue.empty():
            print "\ninput:", input_queue.get()

foobar()
BlackJack hat geschrieben: Ich meine das man `thread` jetzt schon *sehr lange* nicht mehr verwenden sollte.
Statt dessen threading nehmen?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Hier mit threading:

Code: Alles auswählen

import sys
import threading
import time
import Queue

def add_input(input_queue):
    while True:
        input_queue.put(sys.stdin.read(1))

def foobar():
    input_queue = Queue.Queue()

    input_thread = threading.Thread(target=add_input, args=(input_queue,))
    input_thread.daemon = True
    input_thread.start()

    last_update = time.time()
    while True:

        if time.time()-last_update>0.5:
            sys.stdout.write(".")
            last_update = time.time()

        if not input_queue.empty():
            print "\ninput:", input_queue.get()

foobar()

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten