twitch-plays/src/reader.py

64 lines
1.4 KiB
Python

import threading
import queue
import time
import sys
import select
__interval__ = .1
class Reader:
def __init__(self, reader):
self.reader = reader
def read(self):
q = queue.Queue(maxsize=1)
class async_reader(threading.Thread):
def __init__(self, q, foo):
threading.Thread.__init__(self)
self.q = q
self.foo = foo
self.stopping = False
def stop(self):
self.stopping = True
def run(self):
while not self.stopping:
try:
self.q.put_nowait(self.foo())
except queue.Full:
pass
time.sleep(__interval__/2.0)
reader = async_reader(q, self.reader.read)
reader.start()
try:
while not reader.stopping:
try:
yield q.get(timeout=__interval__)
except queue.Empty:
yield None
pass
except KeyboardInterrupt as e:
reader.stop()
reader.join()
raise e
class StdinReader:
def read(self):
try:
if select.select([sys.stdin,],[],[],__interval__/2.0)[0]:
line = sys.stdin.readline()
return line.strip()
except Exception as e:
pass
return None
class FileReader:
def __init__(self, path):
self.f = open(path, "r")
def read(self):
return self.f.readline()