instance is passed to handlers class LoginHandler(tornado.web.RequestHandler): @tornado.gen.coroutine def get(self): # Do login stuff ... # Suggest we have ans SMS sender client in app sms = self.application.sms_sender # Notify and redirect ...
__name__ == "__main__": # ... # This is like "while True:" with callbacks # (handlers) for READ, WRITE and ERROR tornado.ioloop.IOLoop.instance().start()
# We may treat Handlers as Views class FeedHandler(tornado.web.RequestHandler): @tornado.gen.coroutine def get(self): feed = yield Feed.fetch() self.write(feed)
# Model layer example: just an idea, not real feed class Feed: @classmethod @tornado.gen.coroutine def fetch(cls): http_client = AsyncHTTPClient() url = 'http://httpbin.org/delay/1' response = yield http_client.fetch(url) body = response.body.decode('utf-8') return json.loads(body)
tornado.web class Application(tornado.web.Application): def __init__(self): # Prepare IOLoop class to run on asyncio at very start tornado.ioloop.IOLoop.configure('tornado.platform.asyncio.AsyncIOMainLoop') # ... if __name__ == "__main__": application = Application() application.listen(8888) loop = asyncio.get_event_loop() loop.run_forever() • Prepare loop before instantiation • Instantiate loop after forking
Prepare application server application = Application() server = tornado.httpserver.HTTPServer(application) server.bind(8888, '127.0.0.1') # Fork by number of processor cores server.start(0) # Instantiate and run loop after forking loop = asyncio.get_event_loop() application.init_with_loop(loop) loop.run_forever() • asyncio + Tornado multiple processes