2012-07-10 13 views
13

He escrito una secuencia de comandos que utiliza dos grupos de subprocesos de diez subprocesos cada uno para extraer datos de una API. El grupo de subprocesos implementa this code on ActiveState. Cada grupo de subprocesos está supervisando una base de datos de Redis a través del PubSub para nuevas entradas. Cuando se publica una nueva entrada, python pasa los datos a una función que usa el Subprocess.POpen de python para ejecutar un shell de PHP para hacer el trabajo real de llamar a la API.¿Controlar la prioridad de programación de subprocesos de python?

Este sistema de lanzamiento de shells PHP es necesario para la funcionalidad con mi aplicación web PHP, por lo que no se puede evitar el lanzamiento de shells PHP con Python.

Este script solo se ejecutará en servidores Linux.

¿Cómo controlo el niceness (prioridad de programación) de los subprocesos de la aplicación?

Editar:

Parece que controla la prioridad de planificación de hilos individuales en Python no es posible. ¿Hay una solución de python, o al menos un comando de UNIX que pueda ejecutar junto con mi script, para controlar la prioridad?

Edición 2:

Bueno, yo no terminó por encontrar una forma de pitón para manejarlo. Sólo estoy corriendo mi guión con un bonito ahora así:

nice -n 19 python MyScript.py 

Respuesta

11

creo que la prioridad de roscado no es controlable en Python, debido a la forma en que se implementan utilizando una cerradura intérprete mundial (GIL). Habiendo dicho eso, incluso si pudieras darle a un hilo más prioridad de procesamiento de la CPU, la implementación de Python que maneja el GIL no estaría al tanto de esto ya que entregó el GIL. Si fue capaz de aumentar la amabilidad en un solo hilo de su grupo (supongamos que está haciendo un trabajo más importante), necesitaría usar su propia implementación de bloqueos para otorgarle al subproceso de mayor prioridad al GIL con mayor frecuencia.

Una búsqueda en Google devuelve este artículo que creo que es similar a lo que están pidiendo

explica por qué no funciona http://www.velocityreviews.com/forums/t329441-threading-priority.html

explica la solución que estaba sugiriendo http://bytes.com/topic/python/answers/645966-setting-thread-priorities

+0

¡Gracias por la respuesta! He reformulado la pregunta y ahora pregunto cómo puedo establecer la prioridad del cronograma para la aplicación como un todo en vez de individual. Eso aún debería satisfacer mis necesidades. He actualizado tu respuesta y te elegiré como la mejor respuesta si no obtengo ninguna otra respuesta. – Backus

1

Me preguntaba si this answer at another related question podría ser útil en este escenario? (link)

Como ya está utilizando Subprocess.POpen para poner en marcha su script PHP, se me ocurre que puede utilizar "preexec_fn" y, o bien una función predefinida o una función lambda (como se demuestra en la respuesta vinculado anteriormente) para establecer el nivel agradable de cada hilo PHP lanzado?

2

Lo sé, ha pasado mucho tiempo, pero recientemente me encontré con esta pregunta, y pensé que sería útil agregar otra opción.

Tenga una mirada en threading2, que es una gota en reemplazo y extensión para el defecto enhebrar módulo, con el apoyo - más o menos - para prioridad y afinidad.

Cuestiones relacionadas