le processus python prend 100% CPU

j'essaie d'exécuter une application python et d'exécuter des actions basées sur un intervalle spécifié. Ci-dessous le code consomme constamment 100% de CPU.

def action_print():

    print "hello there"

interval = 5
next_run = 0

while True:

    while next_run > time.time():
        pass

    next_run = time.time() + interval

    action_print()

je voudrais éviter de mettre le processus de dormir car il y aura plus d'actions à exécuter à divers intervalles.

s'il vous plaît aviser

4
demandé sur m1k3y3 2012-02-19 17:30:37

2 réponses

Si vous savez quand la prochaine course sera, vous pouvez simplement utiliser time.sleep :

import time
interval = 5
next_run = 0
while True:
   time.sleep(max(0, next_run - time.time()))

   next_run = time.time() + interval
   action_print()

si vous voulez que d'autres threads puissent vous interrompre, utilisez un événement comme ceci:

import time,threading
interval = 5
next_run = 0
interruptEvent = threading.Event()
while True:
   interruptEvent.wait(max(0, next_run - time.time()))
   interruptEvent.clear()

   next_run = time.time() + interval
   action_print()

un autre fil peut maintenant appeler interruptEvent.set() pour réveiller le vôtre.

dans de nombreux cas, vous voudrez également utiliser un serrure pour éviter course conditions sur les données partagées. Assurez-vous d'effacer l'événement pendant que vous tenez la serrure.

vous devez également être conscient que sous cpython, un seul thread peut exécuter du code Python. Par conséquent, si votre programme est lié au CPU sur plusieurs threads et que vous utilisez cpython ou pypy, vous devez remplacer threading par multiprocessing .

13
répondu phihag 2012-02-19 13:41:58

probablement vous ne voulez pas écrire le temps.sommeil (intervalle), mais en remplaçant "passe" par le temps.sleep (0.1) va presque complètement libérer votre CPU, et vous permettra tout de même la flexibilité dans le tout prédicate.

vous pouvez aussi utiliser un thread pour chaque événement que vous programmez et utiliser le temps.sommeil (intervalle) mais cela empêchera tout de même votre unité centrale de fonctionner.

ligne de fond: votre boucle tandis que: passe tourne en rond très rapide consommant tous vos CPU.

2
répondu user1202733 2012-02-19 13:39:46