- Если код не использовал этот декоратор, он не блокирует?
- Почему это имя является асинхронным, значит, добавляет декоратор, пусть код асинхронный?
- Почему @tornado.gen всегда используется вместе с @tornado.web.асинхронно вместе?
Что означает @tornado.web.асинхронный декоратор?
Ответ 1
@tornado.web.asynchronous
предотвращает автоматический вызов RequestHandler
self.finish()
. Это; это просто означает, что Tornado будет поддерживать соединение открытым, пока вы не вызовете вручную self.finish()
.
-
Код, не использующий этот декоратор, может блокировать или нет. Использование декоратора никак не изменилось.
-
Как сказал @Steve Peak, вы используете декоратор для асинхронных запросов, например. поиск базы данных.
-
Обновлено для Tornado 3.1+: Если вы используете
@gen.coroutine
, вам не нужно использовать@asynchronous
. Более старый@gen.engine
интерфейс по-прежнему требует@asynchronous
, я считаю.
Ответ 2
-
Ответ здесь: асинхронный и неблокирующий
-
Подумайте об этом так. Когда вам нужно сделать запрос, чтобы сказать базу данных или другой URL-адрес для извлечения данных, вы не хотите блокировать свой торнадо IO. Таким образом,
@tornado.web.asynchronous
позволит IO обрабатывать другие запросы, пока он ожидает загрузки содержимого (например, базы данных или URL-адреса). -
Они являются симулятивными. Вы, скорее всего, будете использовать
@tornado.web.asynchronous
.
Ответ 3
@tornado.web.asynchronous
по существу является просто маркером, который вы добавляете к методу обработчика, например get()
или post()
, который сообщает фреймворку, что он не должен вызывать finish()
автоматически при возврате метода, поскольку он содержит код, который собирается настроить finish()
для вызова в более позднее время.