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