如果使用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()