2010-07-12 12 views
9

en Python, si yo quiero seguir un proceso o subproceso en ejecución siempre, i normalmente puede hacer esto con un vacío bucle while:espera no bloqueo en Python

while 1: 
    pass 

esto, sin embargo, va a comer una cantidad injusta de proceso de CPU. Agregar un breve descanso funcionaría

import time 
while 1: 
    time.sleep(0.01) 

¿Hay alguna forma mejor y más limpia de hacerlo? Gracias

+0

¿Qué está esperando el hilo? ¿Por qué no haces time.sleep (1000000)? – Sjoerd

+0

es para una aplicación similar a un servidor, por lo que me gustaría esperar más de días (¡1000000 segundos)! teóricamente un hilo que tiene que ejecutarse _forever_ tiene que seguir funcionando durante mucho más tiempo que _una cantidad muy alta de segundos_ – pistacchio

+0

¿El hilo está haciendo * algo útil * que no sea dormir o bucle ocupado? Si no, ¿puedes acabar con eso? Y si * está * haciendo algo que vale la pena, '¡confía! Eso es lo que necesitamos saber para ayudarte. –

Respuesta

7

Teniendo en cuenta los requisitos bastante extraño (un proceso que va siempre sin usar mucha CPU), esto es razonablemente compacta:

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

... Sin embargo, me temo que estoy sucumbir a la tentación de resolver su Y y no su X.

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

Actualización: si usted está guardando un proceso padre va por el bien de sus subprocesos, puede utilizar el método wait() en Popen objects, o el método de join()Process objetos. Ambos métodos se bloquearán indefinidamente hasta que finalice el subproceso. Si está utilizando alguna otra API de subproceso, seguramente habrá una funcionalidad equivalente disponible. Si no, obtenga el PID del proceso y use os.waitpid().

2

No utilice la espera ocupada. Dependiendo de lo que está esperando, use una de las funciones de espera de bloqueo del sistema operativo, p. select en Unix y WaitForSingleObject/WaitForMultipleObjects en Windows.

+0

gracias por la respuesta.sin embargo, no estoy esperando nada. como lo implica la pregunta, el objetivo del proceso es ejecutar _forever_ hasta que se mate. – pistacchio

1

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

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

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

2

¿Cuál es el problema con dormir durante un período muy breve? 1 milisegundo es cerca de una eternidad para una computadora moderna. Siempre que no tenga miles de estos hilos (lo cual suena como que no lo hace), NO HABRÁ NADA al dormir durante 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 blip.

Cuestiones relacionadas