En un controlador de solicitud de tornado si tengo que llamar a la función foo() que no afecta lo que se devuelve al usuario, tiene sentido devolver el resultado primero al usuario y luego llamar a foo(). ¿Es posible hacer esto fácilmente en tornado (o con un paquete de terceros)?Datos de proceso de tornado en el controlador de solicitud después del regreso
Respuesta
No, no es "fácil" listo para usar. A lo que te refieres es a "disparar y olvidar". Incluso si usa un grupo de subprocesos para procesar la solicitud, ese grupo de subprocesos pertenecerá al proceso principal de Python que pertenece a Tornado.
El mejor enfoque es una cola de mensajes. Algo así como Zanahoria. De esa forma, supongamos que tiene una página donde los usuarios pueden ejecutar para comenzar a generar un informe ENORME, puede iniciarla en una cola de mensajes y luego finalizar la solicitud de Tornado y con magia AJAX y otros trucos (fuera del alcance de Tornado). Siéntese y espere hasta que la cola de mensajes haya terminado su trabajo (que técnicamente podría estar sucediendo en un servidor distribuido en una ubicación física diferente).
ioloop.add_callback, Tornado ejecutará la devolución de llamada en la siguiente iteración de IOLoop.
advertencia de advertencia incorrecta: puede usar el multiprocesamiento.
http://docs.python.org/library/multiprocessing.html
tener cuidado de cerrar todas las conexiones de base de datos (en el código generado) y hacer lo tornado más podría hacer cuando normalmente se completa una solicitud sin un subproceso. Las otras respuestas suenan mejor. Pero, puedes hacer esto. No hagas esto
Es muy fácil:
class Handler(tornado.web.RequestHandler):
def get(self):
self.write('response')
self.finish() # Connection is now closed
foo()
¿Esto bloqueará el bucle io? – raylu
Sí, si foo() bloquea IO. No, si foo() no. Regla de oro: si foo() usa IOStream, entonces no bloquea. Si usa sockets sin IOStream, entonces está bloqueando. –
- 1. Python + Tornado Reiniciar después de editar archivos
- 2. Cómo escribir datos en el proceso STDIN del proceso externo?
- 3. Salir del proceso secundario después de os.fork()
- 4. ¿cuál es el tornado ioloop y el flujo de trabajo del tornado?
- 5. Diagramas/Explicaciones del proceso de solicitud de Django?
- 6. ¿Cómo establecer el foco de regreso a la forma después de abrir un proceso (Bloc de notas)?
- 7. ¿Cómo continuar el proceso después de responder a la solicitud de ajax en PHP?
- 8. Cómo compartir datos entre las peticiones de Tornado Web
- 9. Proceso de solicitud HTTP prima
- 10. Solicitud de recepción de fábrica del controlador para "favicon.ico"
- 11. ¿Cómo usar el método POST en Tornado?
- 12. Identificación de solicitud de Ajax o solicitud de navegador en el controlador de grails
- 13. Nuevo proceso de solicitud de Bash Shell
- 14. ¿Cómo obtengo la IP del cliente de una solicitud de Tornado?
- 15. Controlador de solicitud no encontrada:
- 16. tornado equivalente de retardo
- 17. Integración de apio tornado piratea
- 18. Controlador de vista de modelo: ¿El controlador o el modelo recuperan datos del servidor?
- 19. Solicitud de reenvío del resorte 3.0 a un controlador diferente
- 20. Publicación en el servidor de Tornado
- 21. Envío de un archivo binario en Tornado
- 22. Carga de archivo con Tornado
- 23. ¿Hay una nueva instancia de controlador para cada solicitud?
- 24. Implementación de código Tornado
- 25. Restablecer la GPU y el controlador después del error CUDA
- 26. ¿alguien puede ilustrar el regreso de "onOptionsItemSelected"?
- 27. ¿Qué es mejor, el regreso "ModelAndView" o "cadena" en el controlador Spring3
- 28. ¿Matar el proceso después de un tiempo determinado?
- 29. Función devolver el regreso de otra función
- 30. ¿Cómo puedo enviar datos de regreso usando finish?
Es muy fácil; Añadiré una respuesta. –