本文最后更新于:星期日, 五月 31日 2020, 2:37 下午

前言

谈到定时任务,大家可能会优先想到 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

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

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

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

cron

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

# 每天820分执行一次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 类似。各参数的说明如下:

参数说明
yearint型或str,取值四位数的年份,如2020年
monthint型或str,取值范围为1-12月
weekint型或str,取值范围为第1-53周
day_of_weekint型或str,表示一周中的第几天,既可以用0-6表示也可以用其英语缩写表示(mon,tue,wed,thu,fri,sat,sun)
dayint型或str,取值范围为1-31日
hourint型或str,取值范围为0-23时
minuteint型或str,取值范围为0-59分
secondint型或str,取值范围为0-59秒
start_datedatetime型或str,表示开始时间
end_datedatetime型或str,表示结束时间

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

image



本文标题:Python中定时任务框架APScheduler入门教程
文章作者:潘高
发布时间:2020年05月28日 - 20:18:22
最后更新:2020年05月31日 - 14:37:59
原始链接:https://blog.pangao.vip/Python%E4%B8%AD%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1%E6%A1%86%E6%9E%B6APScheduler%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B/
许可协议:署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

太烧脑了,怪不得程序员会掉头发 下一篇
如果这篇文章对你有帮助,或者想给我微小的工作一点点资瓷,请随意打赏。
潘高 微信支付

微信支付

潘高 支付宝

支付宝

 目录