78 lines
1.7 KiB
Python
78 lines
1.7 KiB
Python
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()
|