Skip to content

Instantly share code, notes, and snippets.

@minrk
Created March 21, 2011 04:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save minrk/879024 to your computer and use it in GitHub Desktop.
Save minrk/879024 to your computer and use it in GitHub Desktop.
import os
import time
import json
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from tornado.options import define, options
import zmq
from zmq.eventloop import ioloop, zmqstream
# hijack ioloop
tornado.ioloop.IOLoop = ioloop.IOLoop
ctx = zmq.Context()
sub = ctx.socket(zmq.SUB)
sub.setsockopt(zmq.SUBSCRIBE, b'')
sub.bind('tcp://*:5555')
define("port", default=8888, help="run on the given port", type=int)
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.render('notebook.html')
class SUBHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
def get(self):
self.loop = self.application.loop
self.loop.add_handler(self.application.sub, self._really_get, zmq.POLLIN)
def _really_get(self, sub, evt):
# fetch all available messages, there will be at least one
msgs = []
while True:
try:
msgs.append(sub.recv_multipart(zmq.NOBLOCK))
except zmq.ZMQError as e:
if e.errno != zmq.EAGAIN:
raise e
else:
break
# unregister callback
self.loop.remove_handler(sub)
# write reply and finish
self.write(json.dumps(msgs))
self.finish()
class NotebookApplication(tornado.web.Application):
def __init__(self, sub, loop):
self.sub=sub
self.loop = loop
handlers = [
(r"/", MainHandler),
(r"/sub", SUBHandler)
]
settings = dict(
template_path=os.path.join(os.path.dirname(__file__), "templates"),
static_path=os.path.join(os.path.dirname(__file__), "static"),
)
tornado.web.Application.__init__(self, handlers, **settings)
def main():
tornado.options.parse_command_line()
loop = tornado.ioloop.IOLoop.instance()
application = NotebookApplication(sub, loop)
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(options.port)
print loop
loop.start()
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment