电子说
背影
由于程序需求,监测配置变化需要设置定时任务,每分钟执行一次,对任务持久化要求不高,不需要时可以关闭定时任务
根据上面需求,我找到几个库来实现
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
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跳出,这样也能实现定时暂停。
全部0条评论
快来发表一下你的评论吧 !