python定时计划调度实例

发布时间:2019-09-27编辑:脚本学堂
分享下python定时执行计划任务调度的二个例子,掌握下python定时器的用法,有需要的朋友参考下。

最近使用python处理计划调度方面的工作,主要是事件的延期执行。

总结有三种方式。
1. 使用wx.Timer. 当然前提是使用wxpython进行编程。
这种方式的好处是,wx.Timer默认支持重复执行。但是有时间限制,设定轮循(延迟)时间最好在1ms以内,最大不能超过1s。超过会引起什么样的结果, 我尚未测试。
2. 使用sched模块。
该模块是python 2.5, 2.6内置模块,使用比较简单, 而且可以配置多个schedule。
但是该模块只能在单线程中使用, 当schedule中的事件队列(event queue)非空时,就不能为该scheduler添加新的事件。
3. 使用threading模块的Timer class。
使用Timer, 就可以避免sched模块的缺点。因为每一个事件,都是使用一个Timer实例进行管理,也就是一个单独的线程存在,这样就避免了不能动态添加scheduler的问题。
可以参考:http://docs.python.org/library/sched.html

1. 使用sched.scheduler.
 

复制代码 代码示例:
>>> import sched, time
>>> s = sched.scheduler(time.time, time.sleep)
>>> def print_time(): print "From print_time", time.time()
...
>>> def print_some_times():
...     print time.time()
...     s.enter(5, 1, print_time, ())
...     s.enter(10, 1, print_time, ())
...     s.run()
...     print time.time()
...
>>> print_some_times()
930343690.257
From print_time 930343695.274
From print_time 930343700.273
930343700.276

2. 使用threading.Timer.
 

复制代码 代码示例:
>>> import time
>>> from threading import Timer
>>> def print_time():
...     print "From print_time", time.time()
...
>>> def print_some_times():
...     print time.time()
...     Timer(5, print_time, ()).start()
...     Timer(10, print_time, ()).start()
...     time.sleep(11)  # sleep while time-delay events execute
...     print time.time()
...
>>> print_some_times()
930343690.257
From print_time 930343695.274
From print_time 930343700.273
930343701.301

二者区别:
1中只创建一个scheduler对象, 而将需要调度的任务放入该对象的queue中, 当run这个scheduler时,它会将queue中的任务全部按照时间启动,在所有的任务启动之前,queue中不能放入新的任务。
2中则对每一个任务创建一个Timer实例, 想动态添加任务时只需创建一个新的Timer实例即可。
我在想为什么1中不为每个任务创建一个scheduler呢,那样也避免了这种缺陷。
估计是scheduler比较“重“, 至少它需要维护一个event queue,这样系统开销就比较大,可能还有其他方面的问题,有时间看看scheduler的源码,分析一下。