Python sched模块定时任务用法与多线程实现
本文详解Python中sched模块的定时任务用法,包括enter方法的参数含义、优先级处理及run()阻塞特性。同时介绍利用threading.Timer实现非阻塞多线程定时任务的方案,解决单线程执行导致的延迟问题,帮助开发者掌握灵活的任务调度技巧。
本文详细介绍Python中sched模块在定时任务中的应用方法,供读者参考学习。
借助sched模块,可以灵活地自定义执行时间、指定回调函数以及设定任务优先级来调度函数执行。
示例一
import time import sched schedule = sched.scheduler( time.time,time.sleep) def func(string1): print "now excuted func is %s"%string1 print "start" schedule.enter(2,0,func,(1,)) schedule.enter(2,0,func,(2,)) schedule.enter(3,0,func,(3,)) schedule.enter(4,0,func,(4,)) schedule.run() print "end"
schedule是一个调度器对象,其变量名可任意指定。
schedule.enter(delay,priority,action,arguments)
- 第一个参数为整数或浮点数,表示距离当前时间多少秒后执行该action任务。
- 第二个参数priority表示优先级,数值越小优先级越高(0为最高,1次之,2再次)。若多个任务预定在同一时刻执行,系统将依据优先级决定执行顺序。
- 第三个参数指定要执行的任务,通常理解为待执行函数的名称。
- 第四个参数为传递给定时执行函数的具体参数。建议将参数用括号包裹;若仅传入单个参数,括号内该参数后必须添加逗号,否则可能引发错误。
具体代码如下:
schedule.enter(delay, priority, action, (argument1,))
调用run()会一直阻塞程序,直至所有任务执行完毕。由于所有任务在同一线程中运行,若某个任务耗时超过其他任务的等待时间,后续任务将被推迟执行。这确保了任务不丢失,但实际调用时间会晚于设定时间。
多线程执行定时任务方案
示例二
import time
import sched
from threading import Timer
def print_name(str):
print "i'm %s"%str
print "start"
Timer(5,print_name,("superman",)).start()
Timer(10,print_name,("spiderman",)).start()
print "end"
利用多线程机制实现定时任务调度。
在多线程环境下,若仅依赖schedule,可能因线程安全问题导致阻塞:当一个任务未结束时,其他任务需等待执行。
改用threading.Timer可避免上述问题。其效果是直接执行Print start和print end,而定时任务则独立分开执行。此时打印end不会发生阻塞。
如需了解更多Python相关知识,可查阅本站专题:《Python日期与时间操作技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》。
希望本文所述内容对大家的Python程序设计有所帮助。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













