背影
由于程序需求,监测配置变化需要设置定时任务,每分钟执行一次,对任务持久化要求不高,不需要时可以关闭定时任务
定时任务库对比
根据上面需求,我找到几个库来实现
schedule:Python job scheduling for humans. 轻量级,无需配置的作业调度库
Apscheduler:一个高级的 Python 任务调度库
Celery:是一个简单,灵活,可靠的分布式系统,用于处理大量消息,同时为操作提供维护此类系统所需的工具, 也可用于任务调度
基于我们的需求,我们只需要轻量级的库就可以,我们选用schedule库
直接使用 pip install schedule
进行安装使用
import schedule
import time
# 定义你要周期运行的函数
def job():
print("I'm working...")
schedule.every(10).minutes.do(job) # 每隔 10 分钟运行一次 job 函数
schedule.every().hour.do(job) # 每隔 1 小时运行一次 job 函数
schedule.every().day.at("10:30").do(job) # 每天在 10:30 时间点运行 job 函数
schedule.every().monday.do(job) # 每周一 运行一次 job 函数
schedule.every().wednesday.at("13:15").do(job) # 每周三 13:15 时间点运行 job 函数
schedule.every().minute.at(":17").do(job) # 每分钟的 17 秒时间点运行 job 函数
while True:
schedule.run_pending() # 运行所有可以运行的任务
time.sleep(1)
上述是简单的使用示例,我们需求定时分钟级就用schedule.every(1).minutes.do(job) 就可以,但是定时任务执行后会占用线程,那么运行后我们的程序会卡,schedule 是阻塞式的,默认情况下, schedule 按顺序执行所有的作业,不能达到并行执行任务,我们使用多线程来解决。
可看到有三个类CancelJob、Scheduler、Job
CancelJob
class CancelJob(object):
pass
可以看到这是一个空类,这个类的作用是当job执行函数返回一个CancelJob类型的对象时,执行完之后就会被Schedule移除,简单说就是只会执行一次。
其它源码可以自行查看学习。
items =schedule.get_jobs() #调用这个可以显示所有定时任务,括号内可以加特定的tag,只显示特定的任务
print(items)
for item in items:
item=str(item)
self.tree1.insert('',0,values=[item])
我们使用这个来作为任务管理界面显示所有定时任务。
那么定时任务怎么取消呢?
# 通过 tag 函数给它们添加唯一标识符进行分组,取消时通过标识符进行取消相应组的任务
def greet(name):
print('Hello {}'.format(name))
schedule.every().day.do(greet, 'Andrea').tag('daily-tasks', 'friend')
schedule.every().hour.do(greet, 'John').tag('hourly-tasks', 'friend')
schedule.every().hour.do(greet, 'Monica').tag('hourly-tasks', 'customer')
schedule.every().day.do(greet, 'Derek').tag('daily-tasks', 'guest')
schedule.clear('daily-tasks')
schedule取消定时任务,通过tag来进行标识,这样就能实现简单的定时任务管理与删除。
其实我们也可以使用循环来实现重复执行函数加上time.sleep()来实现定时执行,循环里加个条件,满足条件就break跳出,这样也能实现定时暂停。
-
定时器
+关注
关注
23文章
3256浏览量
115515 -
python
+关注
关注
56文章
4811浏览量
85102
发布评论请先 登录
相关推荐
关于stm32系统定时任务的问题
Linux系统定时任务Crond
定时任务的发展史是怎么样的
![<b class='flag-5'>定时任务</b>的发展史是怎么样的](https://file.elecfans.com/web1/M00/9C/EC/o4YBAF0wDnqAcdbUAAEOnnfW4ho786.png)
SpringBoot如何实现动态增删启停定时任务
![SpringBoot如何实现动态增删启停<b class='flag-5'>定时任务</b>](https://file.elecfans.com/web2/M00/15/BE/poYBAGFNMLeAVLe-AAAHghOb210341.jpg)
Python定时任务的实现方式
解析Golang定时任务库gron设计和原理
求一种SpringBoot定时任务动态管理通用解决方案
Spring Boot中整合两种定时任务的方法
![Spring Boot中整合两种<b class='flag-5'>定时任务</b>的方法](https://file1.elecfans.com/web2/M00/81/FF/wKgZomQvvfaABG6GAABuBEBmiJI154.jpg)
评论