python定时任务实践

电子说

1.3w人已加入

描述

背影

由于程序需求,监测配置变化需要设置定时任务,每分钟执行一次,对任务持久化要求不高,不需要时可以关闭定时任务

定时任务库对比

根据上面需求,我找到几个库来实现

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)   # 每周三 1315 时间点运行 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跳出,这样也能实现定时暂停。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分