Seite 1 von 1

nonblocking input

Verfasst: Dienstag 29. Oktober 2013, 10:10
von jens
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?

Re: nonblocking input

Verfasst: Dienstag 29. Oktober 2013, 10:14
von 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.

Re: nonblocking input

Verfasst: Dienstag 29. Oktober 2013, 10:51
von jens
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?

Re: nonblocking input

Verfasst: Dienstag 29. Oktober 2013, 10:58
von jens
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()