2012-03-03 24 views
5

Tengo un hilo que hace un montón de procesamiento intensivo de CPU, que parece estar bloqueando otros hilos. ¿Cómo lo limito?¿Cómo puedo acelerar los hilos de Python?

Esto es específicamente para web2py, pero una solución general estaría bien.

+3

Es poco probable que la CPU tan intensiva que un hilo hace que bloquea. Es mucho más probable que tenga problemas con Global Interpreter Lock (http://wiki.python.org/moin/GlobalInterpreterLock). Deberá proporcionarnos más información para evaluar la situación. ¿Qué están haciendo exactamente tus hilos? – Wilduck

+1

@Wilduck el subproceso intensivo de CPU puede agregar latencia IO (aunque menos en un Python reciente), vea esto para la ilustración: http://dabeaz.blogspot.com/2010/01/python-gil-visualized.html – Tobu

+0

@Wilduck el hilo realmente llama el código en JS. Tengo la tentación de intentar liberar el GIL (si no es así), pero esto me obligaría a asegurarme de que el JS no necesita el GIL en ningún momento ... Probablemente lo deje por el momento y encuentra una solución. – Chris

Respuesta

3

De hecho acabé sumergiéndome en este tema no hace mucho tiempo, no podrás cambiar la prioridad de subprocesos pero hay formas de evitar esto.

Para darle un poco de contexto sobre el problema, en la implementación de cPython, los hilos enlazados de CPU pueden causar que otros hilos se mueran de hambre debido a la forma en que se libera y se adquiere Global Intérprete Lock o GIL. Curiosamente, este problema empeora en un entorno multinúcleo. Se realizó un análisis y una presentación realmente detallados sobre este tema al David Beazley que se puede encontrar en http://www.dabeaz.com/python/GIL.pdf. Él tiene varias publicaciones en el blog que entran en más detalles. Son largos pero fascinantes.

La versión corta es que el subproceso enlazado a la CPU libera y vuelve a adquirir el GIL antes de que los otros subprocesos se puedan activar para tomarlo. Como resultado, el subproceso enlazado a la CPU contiene el GIL durante más del 90% del tiempo.

Existen algunos patrones que puede utilizar para solucionar este problema. Por ejemplo, puede ejecutar sus tareas vinculadas a la CPU en un proceso completamente diferente. Esto permitirá que el planificador del sistema operativo administre mucho mejor los recursos compartidos y debería permitir que sus subprocesos web2py continúen ejecutándose, ya que los sistemas operativos realmente otorgan un trato preferencial a los hilos enlazados IO. La biblioteca multiprocessing se proporciona para casos como este. Se requerirá más código para que funcione, pero eso debería ayudar.

+0

El multiprocesamiento parece una posible opción, gracias @ William-- – Chris

1

¿Qué versión de Python estás usando? En 3.2, the GIL was changed to yield after fixed timeslices rather than after a certain number of high-level opcodes.

Incluso con ese cambio, ejecutar código intensivo de CPU puede afectar la latencia de su aplicación web (y, a la inversa, la parte sensible a IO evitará que la parte intensiva de CPU ocupe un núcleo completo). Debería simplemente derivar tareas a procesos de trabajo utilizando una cola como beanstalkd, y dejar que el programador del sistema operativo haga su trabajo.

+0

Creo que el nuevo GIL está solo en 3.2. En realidad, están trabajando para mejorarlo aún más en 3.3 http://bugs.python.org/issue7946 Desafortunadamente, el soporte de Python 3 en frameworks web apenas está comenzando a ser trabajado. No he oído hablar de uno estable todavía. – William

+0

@William gracias, corregido. [Las almas intrépidas encontrarán un respaldo aquí.] (Http://bugs.python.org/issue7753) – Tobu

Cuestiones relacionadas