2012-02-19 4 views
3

Я пытаюсь запустить приложение python и выполнять действия на основе указанного интервала. Ниже код постоянно потребляет 100% процессора.Процесс python занимает 100% 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() 

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

пожалуйста посоветуйте

+2

Если вы не хотите спать так или иначе, вы будете записывать CPU. – Mat

+0

Не могли бы вы подробно остановиться на «будет больше действий для выполнения через различные промежутки времени»? –

+0

Как я могу убедиться, что все будет выполнено вовремя во время процесса? Я попытался использовать сон, но все, что меньше секунды, съедает процессор. – m1k3y3

ответ

12

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

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

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() разбудить ваши.

Во многих случаях вы также захотите использовать Lock, чтобы избежать race conditions по совместно используемым данным. Обязательно очистите событие, пока вы держите замок.

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

+0

спасибо, вот что я точно искал – m1k3y3

2

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

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

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

+0

процесс на моем ящике OSX, работающий в то время как True: time.sleep (0.1) показывает сверху как 0.0% использования процессора. – user1202733

Смежные вопросы