pyplot chart python

python - chart - plt title position



Python: ¿pasar o dormir para procesos de larga ejecución? (6)

Ejecutar un método como hilo de fondo con suspensión en Python

import threading import time class ThreadingExample(object): """ Threading example class The run() method will be started and it will run in the background until the application exits. """ def __init__(self, interval=1): """ Constructor :type interval: int :param interval: Check interval, in seconds """ self.interval = interval thread = threading.Thread(target=self.run, args=()) thread.daemon = True # Daemonize thread thread.start() # Start the execution def run(self): """ Method that runs forever """ while True: # Do something print(''Doing something imporant in the background'') time.sleep(self.interval) example = ThreadingExample() time.sleep(3) print(''Checkpoint'') time.sleep(2) print(''Bye'')

Estoy escribiendo una aplicación de procesamiento de colas que usa subprocesos para esperar y responder a los mensajes de la cola que se entregarán a la aplicación. Para la parte principal de la aplicación, solo necesita mantenerse activo. Para un ejemplo de código como:

while True: pass

o

while True: time.sleep(1)

¿Cuál tendrá el menor impacto en un sistema? ¿Cuál es la forma preferida de no hacer nada, pero mantener una aplicación de Python ejecutándose?


¿Por qué dormir? No quieres dormir, quieres esperar a que terminen los hilos.

Asi que

# store the threads you start in a your_threads list, then for a_thread in your_threads: a_thread.join()

Ver: thread.join


Me imagino que time.sleep () tendrá menos sobrecarga en el sistema. El uso del pase hará que el ciclo vuelva a evaluar y vincular la CPU, mientras que el uso de time.sleep permitirá suspender temporalmente la ejecución.

EDITAR : solo para probar el punto, si ejecuta el intérprete python y ejecuta esto:

>>> while True: ... pass ...

Puedes ver cómo Python comienza a consumir un 90-100% de CPU al instante, en comparación con:

>>> import time >>> while True: ... time.sleep(1) ...

Que apenas se registra en el Monitor de actividad (usando OS X aquí, pero debería ser el mismo para cada plataforma).


No le da mucho contexto a lo que realmente está haciendo, pero ¿podría utilizarse Queue lugar de un ciclo explícito de espera ocupada? Si no, asumiría que sleep sería preferible, ya que creo que consumirá menos CPU (como otros ya han notado).

[Editado según la información adicional en el comentario a continuación.]

Tal vez esto es obvio, pero de todos modos, lo que podrías hacer en un caso donde estás leyendo información de los sockets de bloqueo es tener un hilo leído del socket y publicar mensajes formateados adecuadamente en una Queue , y luego tener el resto de tu "trabajador" "hilos que leen de esa cola; los trabajadores bloquearán la lectura de la cola sin la necesidad de pass ni sleep .


Siempre he visto / escuchado que usar el sueño es la mejor manera de hacerlo. Usar sleep evitará que el uso de la CPU de tu intérprete de Python se vuelva loco.


Si está buscando una forma corta de cero CPU para realizar un ciclo para siempre hasta un KeyboardInterrupt, puede usar:

from threading import Event Event().wait()

Para algunos antecedentes, los objetos de Event normalmente se utilizan para esperar a que se completen los procesos largos:

def do_task(): sleep(10) print(''Task complete.'') event.set() event = Event() Thread(do_task).start() event.wait() print(''Continuing...'')

Que impresiones:

Task complete. Continuing...