对龙卷风中的IOLoop如何拾取Application对象感到困惑

时间:2019-05-08 00:05:43

标签: python-3.x tornado

龙卷风的新手,并试图了解基本原理。给定their sample application

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

我了解应用程序对象具有配置值和RequestHandlers(基本上是应用程序的行为),并且我也理解IOLoop是围绕python3的asyncio模块的某种包装。查看the documentation for asyncio可以看到以下示例:

import asyncio
import time

async def say_after(delay, what):
    await asyncio.sleep(delay)
    print(what)

async def main():
    print(f"started at {time.strftime('%X')}")

    await say_after(1, 'hello')
    await say_after(2, 'world')

    print(f"finished at {time.strftime('%X')}")

asyncio.run(main())

这里asyncio被明确告知运行函数main(),而在龙卷风示例中,我没有看到告诉事件循环在何处运行Application obj。两者如何关联?

已经成为herehere

ty!

1 个答案:

答案 0 :(得分:1)

Application.listen最终调用tornado.netutil.add_accept_handler,后者通过IOLoop.current()静态方法在当前IOLoop上注册。