Процесс Python занимает 100% процессора - PullRequest
5 голосов
/ 19 февраля 2012

Я пытаюсь запустить приложение на Python и выполнить действия в течение указанного интервала.Приведенный ниже код постоянно потребляет 100% ресурсов ЦП.

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()

Я бы не хотел переводить процесс в спящий режим, поскольку будет выполняться больше действий с различными интервалами.

, пожалуйста, сообщите

Ответы [ 2 ]

14 голосов
/ 19 февраля 2012

Если вы знаете, когда будет следующий запуск, вы можете просто использовать 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()

Если вы хотите, чтобы другие потоки могли прерывать вас, используйте событие вот так:

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()

Теперь другой поток может вызвать interruptEvent.set(), чтобы разбудить вас.

Во многих случаях вам также понадобится использовать1015 * Блокировка , чтобы избежать условий гонки на общих данных.Обязательно очистите событие, пока удерживаете блокировку.

Вы также должны знать, что в cpython только один поток может выполнять код Python.Поэтому, если ваша программа привязана к нескольким потокам и вы используете cpython или pypy, вы должны заменить threading на multiprocessing.

2 голосов
/ 19 февраля 2012

Предположительно, вы не хотите писать time.sleep (интервал), но замена 'pass' на time.sleep (0.1) почти полностью освободит ваш ЦП и все же даст вам гибкость в предикате WHILE.

В качестве альтернативы вы можете использовать поток для каждого запланированного события и использовать time.sleep (интервал), но это все равно будет связывать ваш ЦП.

Итог: ваш цикл WHILE: PASS вращается ивокруг очень быстро, потребляя весь ваш процессор.

...