запутался в том, как IOLoop в Tornado подхватывает объект Application - PullRequest
0 голосов
/ 08 мая 2019

новичок в Торнадо и пытается понять основы. учитывая их образец приложения :

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 является своего рода оболочкой для модуля asyncio в python3. Глядя на , документация для 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. Как эти два связаны?

был здесь и здесь уже

ти!

1 Ответ

1 голос
/ 08 мая 2019

Application.listen в конечном итоге вызывает tornado.netutil.add_accept_handler, который регистрируется в текущем IOLoop с помощью статического метода IOLoop.current().

...