2017-02-14 2 views
3

выполняется следующее:Python Планировщик против цикла + сна

питон SCHED:

from time import time, sleep 
from sched import scheduler 

def daemon(local_handler): 
    print 'hi' 
    local_handler.enter(3, 1, daemon, (local_handler,)) 

if __name__ == '__main__': 
    handler = scheduler(time, sleep) 
    handler.enter(0, 1, daemon, (handler,)) 
    handler.run() 

питон петля + сон:

from time import sleep 

while True: 
    print 'hello' 
    sleep(3) 

В чем разница между SCHED и loop + sleep, и расписание остановится при изменении системного времени?

ответ

2

Разница между двумя заключается в том, что планировщик более питонов, чем цикл + сон, по двум причинам: элегантность и модульность.

Длинные петли легко становятся трудночитаемыми и требуют гораздо большего количества кода для написания. Тем не менее, с планировщиком, определенная функция может быть вызвана на задержку, содержащую весь код внутри. Это делает код более читаемым и позволяет перемещать код в классы и модули, которые будут вызываться в основном цикле.

Python знает, что такое текущее время, проверяя локальную систему. Если время локальной системы изменилось, это повлияет на текущую запущенную программу или скрипт.

0

Остановлено, что расписание python использует системное время для следующей итерации. Сон используется cpu time clock для следующей итерации.

0

Большое различие заключается в том, что задержка между несколькими задачами рассчитывается по мере необходимости. Это означает, что ваш цикл будет принимать:

  • время он должен print("hello") или сделать задачу, что вам нужно сделать
  • время, необходимое для sleep(3)

в то время как если вы измените порядок в вашем планировщиком чтобы:

local_handler.enter(3, 1, daemon, (local_handler,)) 
do_the_task 

ваша следующая задача будет выполняться либо по истечении 3 секунд, или сразу же после того, как do_the_task, если это заняло больше времени, чем 3 секунд.

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

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

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