如果使用tornado自帶的事件循環,那么許多基於asyncio的第三方包可能用不了,比如aioredis,tornado中使用asyncio的兩種方式:
一、第一種方式是通過 AsyncIOMainLoop,但必須顯示的調用asyncio的事件循環
from tornado.platform.asyncio import AsyncIOMainLoop import asyncio def main(): AsyncIOMainLoop().install() port = os.environ.get("PORT", 8080) app = Application([ url(r"/", MainHandler), (r'/ws', WSHandler), (r'/static/(.*)', StaticFileHandler, {'path': "."}) ]) print("Starting server at port: %s" % port) app.listen(port) asyncio.get_event_loop().run_forever()
二、第二種比較適合tornado風格創建事件循環的方式,可讀性更強
from tornado.ioloop import IOLoop class MainHandler(tornado.web.RequestHandler): async def get(self): await go() self.write("Hello, world") def make_app(): IOLoop.configure('tornado.platform.asyncio.AsyncIOLoop') return tornado.web.Application([ (r"/", MainHandler), ]) if __name__ == "__main__": app = make_app() app.listen(8888) IOLoop.instance().start()