2011-03-11 10 views

Respuesta

-1

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).

+0

Es muy fácil; Añadiré una respuesta. –

5

ioloop.add_callback, Tornado ejecutará la devolución de llamada en la siguiente iteración de IOLoop.

0

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

9

Es muy fácil:

class Handler(tornado.web.RequestHandler): 
    def get(self): 
     self.write('response') 
     self.finish() # Connection is now closed 
     foo() 
+0

¿Esto bloqueará el bucle io? – raylu

+2

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. –

Cuestiones relacionadas