Python中定时任务框架APScheduler入门教程

4,802 阅读4分钟

前言

更多内容,请访问我的 个人博客


谈到定时任务,大家可能会优先想到 linux 中的 crontab ,或者 windows 中的任务计划。这些工具用起来都很方便,但是说出来你可能不信,最近我在生信流程中使用 crontab 命令完成一些自动化操作时,遇到问题了。

不知是不是 crontab 命令不允许有 qsub 的提交操作,还是管理员设置了 crontab 发起任务的用户没有节点访问权限。。。总之,一向很便利的 crontab 命令居然给我挖坑了。于是,我只得自己写一个定时任务。

当然,核心功能是基于今天的主角 APScheduler 定时任务框架。

安装

安装只需要一行命令。

pip3 install apscheduler

如果对Python的环境搭建及模块安装还不熟悉,可以看看我写的另一篇博客 Python环境搭建及模块安装

运行

首先介绍两个最常用的调度器:

  • BlockingScheduler
    阻塞式调度器:适用于只跑调度器的程序。
  • BackgroundScheduler
    后台调度器:适用于非阻塞的情况,调度器会在后台独立运行。

这是人说的话吗?字我都看得懂,意思一点也不明白。。。
简单说来,可以把 BlockingScheduler 看成是单线程,如果在程序中仅仅只运行定时任务,那么就应该选择阻塞式调度器。
而把 BackgroundScheduler 看成是多线程,如果在程序中除了运行定时任务,咱们还想同时做点别的计算啥的,那就应该选择后台调度器。

这里我选择使用 BlockingScheduler 阻塞式调度器,主程序只负责调度定时任务,不执行其他计算等操作。 如下所示:

from apscheduler.schedulers.blocking import BlockingScheduler    # 引入模块


def task():
    '''定时任务'''
    os.system('python3 spider.py')


if __name__ == '__main__':
    scheduler = BlockingScheduler()

    # 添加任务
    scheduler.add_job(task, 'cron', hour=11, minute=30)

    scheduler.start()

运行上面这段代码,就会在每天的11:30时执行 python3 spider.py 命令。

其中,出现了个新标签 cron,这玩意儿叫触发器,可以设置定时任务触发的条件,这里就简单介绍一下这个小东西。

APScheduler有三种内置的触发器:

date

日期,在某个具体的日期触发定时任务,仅触发一次。

# 在2020-1-3这一天的凌晨执行task函数
scheduler.add_job(task, 'date', run_date=date(2020, 1, 3))

# 在1990-12-22 14:30:22时执行task函数
scheduler.add_job(task, 'date', run_date='1990-12-22 14:30:22')

# 未指定时间,则会立即执行
scheduler.add_job(task, 'date')

如上所示,run_date 参数可以是 date型str型,甚至可以不显式指定。

interval

间隔,在某个时间间隔后触发定时任务,间隔触发无限次。

# 每隔1周3天8时20分5秒执行一次task函数
scheduler.add_job(task, 'interval', weeks=1,days=3,hours=8,minutes=20,seconds=5)

如上所示,weeks、days、hours、minutes、seconds 的参数都是 int型

cron

周期,在某个周期内触发定时任务,循环触发无限次。

# 每天8时20分执行一次task函数
scheduler.add_job(task, 'cron', hour=8,minute=20)

# 从星期一到星期五的每一天8:20执行一次task函数,直到2100-05-20程序终止
scheduler.add_job(task, 'cron', day_of_week='mon-fri',hour=8,minute=20,end_date='2100-05-20')

该触发器的规则和 crontab 类似。各参数的说明如下:

参数 说明
year int型或str,取值四位数的年份,如2020年
month int型或str,取值范围为1-12月
week int型或str,取值范围为第1-53周
day_of_week int型或str,表示一周中的第几天,既可以用0-6表示也可以用其英语缩写表示(mon,tue,wed,thu,fri,sat,sun)
day int型或str,取值范围为1-31日
hour int型或str,取值范围为0-23时
minute int型或str,取值范围为0-59分
second int型或str,取值范围为0-59秒
start_date datetime型或str,表示开始时间
end_date datetime型或str,表示结束时间

更多编程教学请关注公众号:潘高陪你学编程

image