版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Python任务调度之sched 这次我们主要讲解下Python自带模块当中的sched,不但小巧,也很强大,在实际应用中,某些场合还是可以用到的。作为一名Linux的SA,我们已经习惯了用crontab,而sched提供了一种延迟处理机制,也可以理解为任务调度的另一种方式的实现。 scheduler.enter(delay, priority, action, argument) delay:延迟时间 priority:优先级 action:回调函数 argument:回调函数的参数 我们来写一个非常简单的例子:import sched import time scheduler = sch
2、ed.scheduler(time.time, time.sleep) def func(name): print action: %s % name , time.time() print START:, time.time() scheduler.enter(2, 1, func, (fight,) scheduler.enter(3, 1, func, (make peace,) scheduler.run() print END:, time.time() 运行结果如下: START:.4 action:fight .4 action: makepeace .4 END:.4 我们再举
3、一个简单的例子说明下sched的其它特性:import sched import time scheduler = sched.scheduler(time.time, time.sleep) def func(name): print BEGIN: %s: % name, time.time() time.sleep(2) print FINISH %s: % name, time.time() print START:, time.time() scheduler.enter(2, 1, func, (fight,) scheduler.enter(3, 1, func, (make pe
4、ace,) scheduler.run() print END:, time.time() 运行结果如下: START:.12 BEGIN:fight: .12 FINISHfight: .12 BEGIN: makepeace: .12 FINISH makepeace: .12 END:.12 我们仔细观察下两次任务调度的时间间隔,发现是同时运行的?那又是为什么呢?run()一直被阻塞,直到所有事件被全部执行完.每个事件在同一线程中运行,所以如果一个事件的执行时间大于其他事件的延迟时间,那么,就会产生重叠。重叠的解决方法是推迟后来事件的执行时间。这样保证没有丢失任何事件,但这些事件的调用时
5、刻会比原先设定的迟。 上面的例子第二个事件在第一个事件运行结束后立即运行,因为第一个事件的执行时间足够长,已经超过第二个事件的预期开始时刻。(本来应该秒运行) 我们再介绍另外一个保证action在同一时刻执行的函数: scheduler.enterabs(time, priority, action, argument)import sched import time scheduler = sched.scheduler(time.time, time.sleep) now = time.time() def func(name): print action:, time.time(), n
6、ame print START:, now scheduler.enterabs(now + 2, 2, func, (make peace,) scheduler.enterabs(now + 2, 1, func, (fight,) scheduler.run() print END:, now 运行结果如下: START:.38 action:.38 fight action:.38 make peace END:.38 因为优先级的关系,所以先fight,然后再makepeace,打架是如此重要.总体来讲,如果想单纯的替换crontab的话,Scheduler框架更加适合,做延迟任务的
7、调度处理的话sched还是可以考虑的。 如果我们想要取消任务调度,可以使用cancel()函数。在上面的例子中出现了阻塞延迟的现象,如果引用线程机制就会避免这种情况的发生,我们简单举个例子:import sched import threading import time scheduler = sched.scheduler(time.time, time.sleep) counter = 0 def increment_counter(name): global counter print action: %s % name , time.time() counter += 1 print
8、 counter: , counter print START:, time.time() action1 = scheduler.enter(2, 1, increment_counter, (action1,) action2 = scheduler.enter(3, 1, increment_counter, (action2,) t = threading.Thread(target=scheduler.run) t.start() scheduler.cancel(action1) t.join() print counter:, counter print END:, time.time() 运行结果如下: START:.27 action:action2.27 counter: 1 counter:1 EN
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论