龙卷风的新手,并试图了解基本原理。给定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。两者如何关联?
答案 0 :(得分:1)
Application.listen
最终调用tornado.netutil.add_accept_handler
,后者通过IOLoop.current()
静态方法在当前IOLoop上注册。