thread raspberry hilos entre ejemplos ejecución detener datos comunicacion compartir python multithreading threadpool scheduling nice

raspberry - ¿Controlando la prioridad de programación de los hilos de python?



modulo thread python (5)

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 este código en ActiveState . Cada grupo de subprocesos está supervisando una base de datos Redis a través de PubSub para nuevas entradas. Cuando se publica una nueva entrada, python pasa los datos a una función que utiliza Subprocess.POpen de python para ejecutar un shell de PHP para hacer el trabajo real de llamar a la API.

Este sistema de lanzamiento de shells PHP es necesario para la funcionalidad de 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 la niceness (prioridad de programación) de los hilos de la aplicación?

Editar:

Parece que controlar la prioridad de la programación para subprocesos individuales en Python no es posible. ¿Existe una solución de Python, o al menos un comando de UNIX que pueda ejecutarse junto con mi script, para controlar la prioridad?

Edición 2:

Bueno, no terminé encontrando una forma de pitón para manejarlo. Solo estoy ejecutando mi script con bonito ahora como esto:

nice -n 19 python MyScript.py


Creo que la prioridad de subprocesos no se puede controlar en Python debido a la forma en que se implementan mediante un bloqueo de intérprete global (GIL). Dicho esto, incluso si pudieras darle a un subproceso más prioridad de procesamiento de la CPU, la implementación de Python que entrega la GIL no sería consciente de esto al entregarla a la GIL. Si pudiera aumentar la amabilidad en un solo subproceso en su grupo (digamos que está haciendo un trabajo más importante), tendría que usar su propia implementación de bloqueos para dar el acceso de subproceso de mayor prioridad a la GIL con mayor frecuencia.

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

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


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

Eche un vistazo a threading2 , que es un reemplazo y extensión para el módulo de subprocesos predeterminado, con soporte - más o menos - para prioridad y afinidad.


Los threading-docs python mencionan explícitamente que no hay soporte para establecer prioridades de hilo:

El diseño de este módulo se basa libremente en el modelo de subprocesos de Java. Sin embargo, donde Java hace que los bloqueos y las condiciones condicionen el comportamiento básico de cada objeto, son objetos separados en Python. La clase Thread de Python admite un subconjunto del comportamiento de la clase Thread de Java; Actualmente, no hay prioridades , no hay grupos de subprocesos y los subprocesos no se pueden destruir, detener, suspender, reanudar o interrumpir. Los métodos estáticos de la clase Thread de Java, cuando se implementan, se asignan a funciones de nivel de módulo.


Me preguntaba si esta respuesta en otra pregunta relacionada podría ser útil en este escenario? ( enlace )

Como ya está utilizando Subprocess.POpen para iniciar su script PHP, me parece que puede usar "preexec_fn" y una función predefinida, o una función lambda (como se demuestra en la respuesta vinculada anterior) para establecer el nivel adecuado de cada ha lanzado un hilo PHP?


No funciona, pero lo intenté:

  1. obteniendo el padre pid y prioridad
  2. iniciando hilos usando concurrent.futures.ThreadPoolExecutor
  3. usando ctypes para obtener el id de hilo (linux) desde dentro del hilo (funciona)
  4. usando el tid con os.setpriority (os.PRIO_PROCESS, tid, parent_priority + 1)
  5. llamando a pool.shutdown () desde el padre.

Incluso con la rociada liberal de os.sched_yield (), los subprocesos secundarios nunca pasan el setpriority ().

Al leer las páginas de manual, parece que los hilos no tienen la capacidad de cambiar (incluso su) prioridad de programación; tienes que hacer algo con "capacidades" para darle al hilo la capacidad "CAP_SYS_NICE". Ejecutar el proceso con permisos de root tampoco ayudó; Los hilos secundarios aún no se ejecutan.