No locking espera en python

en Python, si quiero mantener un proceso o un hilo en ejecución para siempre , normalmente puedo hacer esto con un bucle while vacío:

while 1: pass 

esto, sin embargo, consumirá una cantidad injusta de proceso de CPU. Añadir un sueño corto funcionaría

 import time while 1: time.sleep(0.01) 

¿Hay alguna manera mejor y más limpia de hacer esto? Gracias

Dados los requisitos bastante extraños (un proceso que dura una eternidad sin utilizar mucha CPU), esto es razonablemente compacto:

 import threading dummy_event = threading.Event() dummy_event.wait() 

… sin embargo, me temo que estoy sucumbiendo a la tentación de resolver tu Y y no tu X.

Además, esto no funcionará si su plataforma no proporciona el módulo de threading . Si intenta sustituir el módulo dummy_event.wait() , dummy_event.wait() regresa inmediatamente.

Actualización: si solo está manteniendo un proceso principal por sus subprocesos, puede usar el método wait() en los objetos Popen , o el método join() en los objetos Process . Ambos métodos se bloquearán indefinidamente hasta que finalice el subproceso. Si está utilizando alguna otra API de subproceso, es probable que haya una funcionalidad equivalente disponible. De lo contrario, obtenga el PID del proceso y use os.waitpid() .

No use la espera ocupada. Dependiendo de lo que esté esperando, use una de las funciones de espera de locking del sistema operativo, por ejemplo, select en Unix y WaitForSingleObject / WaitForMultipleObjects en Windows.

¿Cuál es el problema con dormir por un período muy breve de tiempo? 1 milisegundo está cerca de una eternidad para una computadora moderna. Siempre y cuando no tengas miles de estos hilos (lo que parece que no lo tienes), entonces NO HAY NADA malo en dormir por uno, diez, diez mil o diez millones de milisegundos en cada iteración a través del ciclo. La CPU ni siquiera notará este pequeño problema.

Si confía en este script para realizar el mantenimiento periódico, use cron (UNIX) o tareas progtwigdas (Windows).

Si desea esperar a que se completen los subprocesos, use os.waitpid .

Si desea esperar por la actividad del sistema de archivos, use pyinotify .