软硬件环境

windows 10 64bits

anaconda with python 3.7

视频看这里

前言

说起定时任务,第一反应应该是windows自带的计划任务或者linux自带的crontab,关于ubuntu操作系统下如何使用crontab可以参考下面这支视频。

安装

安装非常简单, 使用pip

pip install apscheduler

apscheduler的四大组件

triggers 触发器 可以按照日期、时间间隔或者contab表达式三种方式触发

job stores 作业存储器 指定作业存放的位置,默认保存在内存,也可以保存在各种数据库中

executors 执行器 将指定的作业提交到线程池或者进程池中运行

schedulers 作业调度器 常用的有BackgroundScheduler(后台运行)和BlockingScheduler(阻塞式)

代码实践

下面通过几个示例来看看如何来使用apscheduler

import time

from apscheduler.schedulers.background import BlockingScheduler

from apscheduler.triggers.interval import IntervalTrigger

def my_job():

print('my_job, {}'.format(time.ctime()))

if __name__ == "__main__":

scheduler = BlockingScheduler()

# 间隔设置为1秒,还可以使用minutes、hours、days、weeks等

intervalTrigger=IntervalTrigger(seconds=1)

# 给作业设个id,方便作业的后续操作,暂停、取消等

scheduler.add_job(my_job, intervalTrigger, id='my_job_id')

scheduler.start()

print('=== end. ===')

执行代码,输出是这样的

因为我们使用了BlockingScheduler,它是阻塞式的,所以只看到了my_job方法中的输出,而语句print('=== end. ===')并没有被执行。BackgroundScheduler它可以在后台运行,不会阻塞主线程的执行,来看下面的代码

import time

from apscheduler.schedulers.background import BackgroundScheduler

from apscheduler.triggers.interval import IntervalTrigger

def my_job():

print('my_job, {}'.format(time.ctime()))

if __name__ == "__main__":

scheduler = BackgroundScheduler()

intervalTrigger=IntervalTrigger(seconds=1)

scheduler.add_job(my_job, intervalTrigger, id='my_job_id')

scheduler.start()

print('=== end. ===')

while True:

time.sleep(1)

代码执行的结果是这样的

如果把triggers设置成DateTrigger,就变成作业在某一个时间点执行,示例如下

import time

import datetime

from apscheduler.schedulers.background import BlockingScheduler

from apscheduler.triggers.date import DateTrigger

def my_job():

print('my_job, {}'.format(time.ctime()))

if __name__ == "__main__":

scheduler = BlockingScheduler()

intervalTrigger=DateTrigger(run_date='2020-07-17 16:18:55')

scheduler.add_job(my_job, intervalTrigger, id='my_job_id')

scheduler.start()

等到设定的时间到了,作业就会被自行一次

如果想按照指定的周期去执行的话,就需要使用CronTrigger了,工作原理跟UNIX中crontab定时任务非常相似,它可以指定非常详细且复杂的规则。同样的来看示例代码

import time

from apscheduler.schedulers.background import BlockingScheduler

from apscheduler.triggers.cron import CronTrigger

def my_job():

print('my_job, {}'.format(time.ctime()))

if __name__ == "__main__":

scheduler = BlockingScheduler()

# 第一秒执行作业

intervalTrigger=CronTrigger(second=1)

# 每天的19:30:01执行作业

# intervalTrigger=CronTrigger(hour=19, minute=30, second=1)

# 每年的10月1日19点执行作业

# intervalTrigger=CronTrigger(month=10, day=1, hour=19)

scheduler.add_job(my_job, intervalTrigger, id='my_job_id')

scheduler.start()

代码执行的效果是这样的

上面的代码中并没有使用executors,因为只有一个作业,但是从调试中可以发现,默认情况下,apscheduler也是使用了ThreadPoolExecutor,且线程池的大小是10

下面我们看看executors的使用

import time

from apscheduler.schedulers.background import BlockingScheduler

from apscheduler.triggers.interval import IntervalTrigger

from apscheduler.executors.pool import ThreadPoolExecutor

def my_job():

print('my_job, {}'.format(time.ctime()))

if __name__ == "__main__":

executors = {

'default': ThreadPoolExecutor(20)

}

scheduler = BlockingScheduler(executors=executors)

intervalTrigger=IntervalTrigger(seconds=1)

scheduler.add_job(my_job, intervalTrigger, id='my_job_id')

scheduler.start()

可以看到,我们将线程池的大小改为了20,在初始化scheduler的时候将executors传递进去,后面的操作就跟之前的完全一样了

关于ThreadPoolExecutor和ProcessPoolExecutor的选择问题,这里有一个原则,如果是cpu密集型的作业,使用ProcessPoolExecutor,其它的使用ThreadPoolExecutor,当然ThreadPoolExecutor和ProcessPoolExecutor也是可以混用的

最后我们来看看作业存储器,我们把它改成存储到sqlite中

import time

from apscheduler.schedulers.background import BlockingScheduler

from apscheduler.triggers.interval import IntervalTrigger

from apscheduler.executors.pool import ThreadPoolExecutor

from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore

def my_job():

print('my_job, {}'.format(time.ctime()))

jobstores = {

'default': SQLAlchemyJobStore(url='sqlite:///jobs.sqlite')

}

if __name__ == "__main__":

executors = {

'default': ThreadPoolExecutor(20)

}

scheduler = BlockingScheduler(jobstores=jobstores, executors=executors)

intervalTrigger=IntervalTrigger(seconds=1)

scheduler.add_job(my_job, intervalTrigger, id='my_job_id')

scheduler.start()

代码执行后,会在源码目录下生成sqlite数据库文件jobs.sqlite,我们使用图形化工具打开查看,可以看到数据库中存放的作业的id和作业下次执行的时间

参考资料

python四大软件-Python实用模块(二十)Apscheduler相关推荐

  1. python四大软件-Python未来可能面临的四大转折

    原标题:Python未来可能面临的四大转折 [IT168 评论]Python最好的时代已经过去了,还是未曾来临?该语言广受好评并且可以广泛部署,过去一段时间内,它在许多领域享受爆炸性地增长,如机器学习 ...

  2. Python实用模块(二十二)easydict

    软硬件环境 windows 10 64bit anaconda3 with python 3.7 easydict 1.9 前言 easydict能够让我们使用.操作符,就像访问属性attribute ...

  3. JAVASE基础模块二十四(泛型)

    JAVASE基础模块二十四(泛型) 泛型的引出 我们这样定义一个obj类的时候 使用的时候需要向下转型 会很麻烦 public class Fananan {public static void ma ...

  4. Python爬虫新手入门教学(二十):爬取A站m3u8视频格式视频

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 前文内容 Python爬虫新手入门教学(一):爬取豆瓣电影排行信息 Python爬虫新手入门 ...

  5. python四大软件-9个使用Python的世界级软件公司

    该工作室已将Python用于其工作的多个方面.开发人员使用Python来跟踪和审核管道函数,将每部电影制作的每张图像都保存一个数据库.随着越来越多的ILM程序由Python控制,它创建了一个更简单的统 ...

  6. python中文软件-Python

    Python是一款通用型的计算机程序设计语言,Python对编程人员来说是一款非常有利的工具,可以让您快速编写代码,而且代码运行速度非常快.Python具有非常简捷而清晰的语法特点,适合完成各种高层任 ...

  7. python所有软件-python

    Python是一款通用型的计算机程序设计语言,Python对编程人员来说是一款非常有利的工具,可以让您快速编写代码,而且代码运行速度非常快.Python具有非常简捷而清晰的语法特点,适合完成各种高层任 ...

  8. 苹果手机上的python编程软件-Python编程软件有哪些?

    Python开发软件可根据其用途不同分为两种,一种是Python代码编辑器,一种是Python集成开发工具,两者的配合使用可以极大的提高Python开发人员的编程效率,以下是常用的几款Python代码 ...

  9. 使用 C# 开发智能手机软件:推箱子(二十)

    这是"使用 C# 开发智能手机软件:推箱子" 系列文章的第二十篇.在这篇文章中,介绍 Window/DesignDlg.cs 源程序文件.这个源程序文件包含 DesignDlg 类 ...

最新文章

  1. 输出EXCEL文件的通用函数
  2. 【通知】2020年有三AI-CV夏季划升级,更多项目,更高难度,更加落地
  3. 恶心的openssl。。。
  4. 从Ecipse中导出程序至apk
  5. PP团队圣经巨著《Application Architecture Guide2.0》14章-数据访问层
  6. python简单爬虫课题_VS2019python爬虫入门
  7. OSS音频编程概述(DSP部分)
  8. nginx 重启和配置include的位置
  9. [已解决] 日常开发中禁用Tomcat自动重启
  10. linux 8002端口,linux – 如何限制反向SSH调整端口?
  11. 当前时间时间戳以及10分钟后的时间戳
  12. android之日志库logger
  13. 2010年3月份第三周51aspx发布WinForm源码
  14. 宝塔Linux面板 5.9专业版破解,付费插件安装免费使用,全网首发!
  15. [博学谷学习记录]超强总结,用心分享|第07节 常用的API-----笔记篇
  16. quic client的数据发送流程
  17. 谭民机器人_机器人技术研究进展_谭民
  18. Plug-in org.eclipse.wst.jsdt.ui was unable to load class org.eclipse.wst.jsdt.internal.ui.javaeditor
  19. 微信红包 开发前的准备
  20. 高房楼噪音测试软件,高层住宅噪音测试:11层分贝数高于其他楼层

热门文章

  1. 我所理解的MVCMVPMVVM
  2. 趣谈网络协议笔记-二(第十讲)
  3. Linux下的静态链接库和动态链接库编程
  4. 开发日记-20190807 关键词 读书笔记《Linux 系统管理技术手册(第二版)》DAY 21
  5. 开发日记-20190524 关键词 读书笔记《鸟哥的Linux私房菜-基础学习篇》
  6. packettotal.com - PacketTotal - A Free Online PCAP Analysis Engine
  7. DDos攻击的一些领域知识——(流量模型针对稳定业务比较有效)不稳定业务采用流量成本的检测算法,攻击发生的时候网络中各个协议的占比发生了明显的变化...
  8. SQL数据分析概览——Hive、Impala、Spark SQL、Drill、HAWQ 以及Presto+druid
  9. shiro 的session持久化
  10. ActivityManager