Python调度器 vs 循环+睡眠

3
下面是: Python计划任务模块:
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()

Python循环+睡眠:

from time import sleep

while True:
    print 'hello'
    sleep(3)

sched和loop+sleep之间有什么区别,当系统时间更改时sched会停止吗?

3个回答

3
一个重要的区别是多个任务之间的延迟是根据需要计算的。这意味着您的循环将需要以下时间:
  • 执行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会处理此问题,除非在此期间收到某些信号),但是您的下一个计划任务时间将被推迟。 我相信下一次执行时间不会是您通常预期的时间。


2
两者的区别在于调度程序比循环+休眠更具有Python风格,原因有两个:优雅和模块化。
长时间循环很容易变得难以阅读,并需要编写更多的代码。然而,使用调度程序可以在延迟后调用特定的函数,其中包含所有代码。这使得代码更易读,并允许将代码移动到类和模块中,在主循环中调用。
Python通过检查本地系统来知道当前时间。如果更改了本地系统的时间,则会影响当前运行的程序或脚本。

0
因为Python的sched使用系统时间进行下一次迭代。而sleep使用CPU时间时钟进行下一次迭代。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接