¿Qué significa decorador @ tornado.web.asynchronous?

  1. Si el código no utilizó este decorador, ¿es no bloqueante?
  2. ¿Por qué este nombre es asíncrono, significa agregar un decorador y dejar el código asíncrono?
  3. ¿Por qué @ tornado.gen se usa siempre con @ tornado.web.asynchronous juntos?

@tornado.web.asynchronous evita que el RequestHandler llame automáticamente self.finish() . Eso es; solo significa que Tornado mantendrá la conexión abierta hasta que llame manualmente self.finish() .

  1. Código que no utiliza este decorador puede bloquear, o no. Usar el decorador no cambia eso de ninguna manera.

  2. Como dijo @Steve Peak, utiliza el decorador para solicitudes asíncronas, por ejemplo, recuperación de base de datos.

  3. Actualizado para Tornado 3.1+: Si usa @gen.coroutine , no necesita usar @asynchronous también. La antigua interfaz @gen.engine aún requiere @asynchronous , creo.

  1. Respondido aquí: asíncrono vs sin locking

  2. Piensa en esto, de esta manera. Cuando necesite realizar una solicitud para decir una base de datos u otra URL para recuperar datos, no desea bloquear su IO de tornado. Por lo tanto, @tornado.web.asynchronous permitirá que IO maneje otras solicitudes mientras espera que se cargue el contenido (por ejemplo, la base de datos o la url).

  3. Son simulares. Lo más probable es que uses @tornado.web.asynchronous .

@tornado.web.asynchronous es esencialmente un marcador que @tornado.web.asynchronous en un método de controlador como get() o post() que le dice al marco que no debería llamar a finish() automáticamente cuando el método se devuelve, porque contiene código que va a configurar el finish() para ser llamado en un momento posterior.