Skip to content

Instantly share code, notes, and snippets.

@adiog
Created March 17, 2017 11:11
Show Gist options
  • Save adiog/38195a24e33e0b12071d0df137a21f8e to your computer and use it in GitHub Desktop.
Save adiog/38195a24e33e0b12071d0df137a21f8e to your computer and use it in GitHub Desktop.
Serve stdin with HTTP json
from queue import Queue
from threading import Thread
import json
import sys
import tornado.ioloop
import tornado.web
MAX_NUM_LINES_IN_BUFFER=1000
MAX_NUM_LINES_PER_CHUNK=10
def reader(buffer):
def reader_task(buffer):
while True:
if buffer.qsize() > MAX_NUM_LINES_IN_BUFFER:
buffer.get(False)
buffer.put(sys.stdin.readline())
reader_worker = Thread(target=reader_task, args=(buffer,))
reader_worker.setDaemon(True)
reader_worker.start()
def writer(buffer, port):
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.add_header('Content-Type', 'application/json')
tail = ''
for line in range(MAX_NUM_LINES_PER_CHUNK):
if not buffer.empty():
tail += buffer.get(False)
self.write(json.dumps({'tail': tail}))
application = tornado.web.Application([
(r"/", MainHandler),
])
application.listen(port)
tornado.ioloop.IOLoop.current().start()
if __name__ == "__main__":
try:
port = int(sys.argv[1])
except:
port = 8000
buffer = Queue()
reader(buffer)
writer(buffer, port)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment