Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2153275
  • 博文数量: 333
  • 博客积分: 10161
  • 博客等级: 上将
  • 技术积分: 5238
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-19 08:59
文章分类

全部博文(333)

文章存档

2017年(10)

2014年(2)

2013年(57)

2012年(64)

2011年(76)

2010年(84)

2009年(3)

2008年(37)

分类: Python/Ruby

2011-01-12 00:00:40

最近使用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的问题。 
可以参考: 

写到这里,将参考文章上的例子copy过来, 
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的源码,分析一下。

阅读(2122) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~