import threading import queue import time import sys import select import random __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: s = q.get(timeout=__interval__) if s: s = s.lower().strip() yield s 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 except Exception as e: pass return None class RandomReader: def read(self): seed = random.randint(0, 99) if seed < 10: return "a" elif seed < 50: return "B" else: return "b" class FileReader: def __init__(self, path): self.f = open(path, "r") def read(self): return self.f.readline()