2012-06-09 9 views
7

Entiendo que tornado es un servidor de un solo subproceso y no de bloqueo, por lo tanto, las solicitudes se manejan secuencialmente (excepto cuando se utiliza un enfoque basado en eventos para la operación de IO).¿Es posible la concurrencia en tornado?

Hay una forma de procesar varias solicitudes paralelas en tornado para la ejecución normal (no IO). No puedo bifurcar procesos múltiples ya que necesito un espacio de memoria común en todas las solicitudes.

Si no es posible, por favor sugiérame otros servidores de python que puedan manejar peticiones paralelas y que también admitan wsgi.

Respuesta

7

Si realmente va a tratar con múltiples solicitudes simultáneas que están vinculadas a la computación, y desea hacerlo en Python, entonces necesita un servidor multiproceso, no de subprocesos múltiples. CPython tiene bloqueo de intérprete global (GIL) que impide que más de un subproceso ejecute python bytecode al mismo tiempo.

La mayoría de las aplicaciones web realizan muy pocos cálculos y, en su lugar, están esperando E/S, ya sea desde la base de datos, o el disco, o desde servicios en otros servidores. Asegúrese de que necesita manejar las solicitudes de límite de cómputo antes de descartar Tornado.

5

La respuesta a su pregunta realmente depende de cuánto tiempo se ejecutarán estos subprocesos vinculados al cómputo. Si son de ejecución corta, y la tasa de procesamiento al menos coincide con la velocidad a la que llegan, entonces Tornado estará bien. Es verdaderamente de un solo hilo, pero se escala muy bien.

Si sus solicitudes de cómputo vinculadas son de larga ejecución, entonces usar un servidor de subprocesos no necesariamente ayudará porque, como Ned Batchelder ya señaló, el GIL será un cuello de botella.

Si puede relajar la restricción de tener el mismo espacio de memoria en todas las solicitudes, puede considerar ejecutar Tornado con PyZMQ, ya que proporciona una forma de ejecutar múltiples backend de Tornado, liderado por una única instancia de Tornado . Esto le permite continuar usando Tornado para la solución completa. Consulte el módulo web.zmqweb de PyZMQ para obtener más información.

+0

Gracias por sus respuestas. No estoy al tanto de GIL. Así que de ninguna manera puedo hacer un proceso paralelo usando hilos en CPython y tengo que ir con procesos múltiples. – Adhi

+1

Puede hacer el procesamiento en paralelo en Python, pero no utilizará todos sus recursos, ya que solo usará 1 proceso de CPU pr Python cuando ejecute el código de Python. De modo que puede usar subprocesos para concurrencia, pero hay un cierto límite para las ganancias de rendimiento disponibles. Pero muchas veces Tornado esperará E/S, por lo que puede ganar mucho agregando subprocesos, por ejemplo. –

+0

zmqweb ha sido sacado de PyZMQ en su propio proyecto: https://github.com/ellisonbg/zmqweb –