APScheduler Multi CronTrigger 实现

最近在使用APScheduler做作业调度的时候碰到一个问题,就是有时候我的作业用一个cron trigger不能完全包含所有的触发条件,同时这个作业不能被创建多个实例。

比如期望作业在下面时间运行

  • 每周一到周五的09:00-18:00
  • 每周六,周日的00:00-24:00

此时我们可能就不能仅仅通过一个cron来描述我所有的触发条件,对于这种问题,我期望能对一个作业指定多个cron trigger,当任何一个trigger满足时就触发作业允许。

看了一下APScheduler,它可以支持用户自定trigger,实现起来也比较简单,就是要继承apscheduler.triggers.base.BaseTrigger类,并实现get_next_fire_time(previous_fire_time, now)方法。

好了,说干就干,先实现我的MultiCronTrigger类

  • 这个类里主要包含一个triggers列表,保存所有CronTrigger对象。
  • get_next_fire_time(self, previous_fire_time, now)方法遍历所有CronTrigger对象,调用每个CronTrigger对象的get_next_fire_time()方法,找到其中最小的一个时间然后返回。如果triggers是空或者没有找到就返回None。
  • 理论上这个类是不仅仅只支持传递多个CronTrigger对象,其实它也可以支持传递多个IntervalTrigger对象,或者混合两种对象,但感觉对我意义不大,所以这里主要说传递多个CronTrigger对象的情况。

下面是MultiCronTrigger的代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from apscheduler.triggers.base import BaseTriggerclass MultiCronTrigger(BaseTrigger):triggers = []def __init__(self, triggers):self.triggers = triggersdef get_next_fire_time(self, previous_fire_time, now):min_next_fire_time = Nonefor trigger in self.triggers:next_fire_time = trigger.get_next_fire_time(previous_fire_time, now)if next_fire_time is None:continueif min_next_fire_time is None:min_next_fire_time = next_fire_timeif next_fire_time < min_next_fire_time:min_next_fire_time = next_fire_timereturn min_next_fire_time

整个测试类试试,测试类定义了两个CronTrigger对象,第一个trigger每三秒运行一次作业,第二个trigger每五秒运行一次作业。

import time
from datetime import datetime
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.triggers.cron import CronTriggerdef myjob():print('job run at %s' % datetime.now())if __name__ == '__main__':scheduler = BackgroundScheduler()trigger1 = CronTrigger(hour='*', minute='*', second='*/3')trigger2 = CronTrigger(hour='*', minute='*', second='*/5')job = scheduler.add_job(myjob, MultiCronTrigger([trigger1, trigger2]))scheduler.start()try:while True:time.sleep(5)
except (KeyboardInterrupt, SystemExit):scheduler.shutdown()

运行一下测试,可以看到job在每个3的倍数和5的倍数秒上都会执行作业。

转载请以链接形式标明本文地址
本文地址:http://blog.csdn.net/kongxx/article/details/50508398

APScheduler Multi CronTrigger 实现相关推荐

  1. python四大软件-Python实用模块(二十)Apscheduler

    软硬件环境 windows 10 64bits anaconda with python 3.7 视频看这里 前言 说起定时任务,第一反应应该是windows自带的计划任务或者linux自带的cron ...

  2. python利器怎么编程-Python任务调度利器之APScheduler详解

    任务调度应用场景 所谓的任务调度是指安排任务的执行计划,即何时执行,怎么执行等.在现实项目中经常出现它们的身影:特别是数据类项目,比如实时统计每5分钟网站的访问量,就需要每5分钟定时从日志数据分析访问 ...

  3. apscheduler 绿色版

    由于依赖EntryPoint,因此apscheduler在离线的方式(直接拷贝然后引用)使用时,会报错. 错误信息类似: No trigger by the name "interval/c ...

  4. python apscheduler 动态_基于Flask-APScheduler实现添加动态定时任务

    阅读目录 一.apSheduler 二.Flask-APScheduler 三.动态定时任务 四.uwsgi部署注意事项 一.apSheduler 第一部分内容限于apSheduler3.0以下版本, ...

  5. Python定时任务框架APScheduler快速入门

    文章目录 前言 一.安装 二.简单使用 1.代码如下(示例) 2.APScheduler 的运行流程 三.APScheduler 四组件 1.调度器(schedulers)---不同程序引用 2.任务 ...

  6. Redis 笔记(08)— 事务(一次执行多条命令、命令 watch/multi/exec/discard、错误处理)

    1. 事务概念 Redis 中的事务 (transaction)是一组命令的集合.事务同命令一样是 Redis 的最小执行单位,一个事务中的命令要么都执行,要么都不执行.事务的原理是先将属于一个事务的 ...

  7. (multi)set的某些操作

    (multi)set的某些操作 我们可以把multiset当作平衡树用~ 注意,必须定义小于运算符. s.begin() 返回指向第一个元素的迭代器. s.end() 返回指向最后元素的后面那个虚拟元 ...

  8. 在Ubuntu 16.04.1 LTS上安装XnView Multi Platform图片浏览器0.83

    XnView Multi Platform是一个全平台(Windows, Linux, Mac)下的全能图片工具,类似Windows平台的美图看看,阿香婆图片浏览器等等,效果非常赞,是我在Ubuntu ...

  9. celery源码分析:multi命令分析

    celery源码分析 本文环境python3.5.2,celery4.0.2,django1.10.x系列 celery简介 celery是一款异步任务框架,基于AMQP协议的任务调度框架.使用的场景 ...

最新文章

  1. Android TouchEvent 分发流程
  2. 增加自增列 耗时长_又一批长事务,P0故障谁来背锅?
  3. 多个VSTO解决方案间传输变量
  4. Winfrom实现圆角设计
  5. 对每个小组的评论和建议
  6. dwr框架查看外放方法_先睹为快!IntelliJ IDEA v2019.3带来的新框架和新技术
  7. python接口自动化测试(七)-unittest-批量用例管理
  8. 【Espruino】NO.06 关键是你的仆人(继续)
  9. PLC通讯智能网关-不用PLC编程,实现西门子PLC与罗克韦尔(AB)PLC之间数据通讯
  10. python生成序列_python 之 生成序列号
  11. 国产linux聊天软件,程序员的全平台聊天软件:Rocket.Chat
  12. GAS超标,以太坊告急
  13. 你的独立思考能力正在被它吞噬掉
  14. 2023年核桃仁行业产业布局:全球核桃仁产量稳步增长
  15. CRM项目实战第一天
  16. Kotin 的代理和委托
  17. 几种有趣的电路设计(阻容降压,防过压,LLC,PFC,正激和反激电路)
  18. JS的map方法和Map对象
  19. Sentinel-限流 冷启动
  20. 朝花夕拾:Eclipse断点调试

热门文章

  1. DNS 缓存、CDN 缓存、浏览器缓存,JVM DNS 缓存详解
  2. Sublime text 3 汉化 破解版
  3. PermissionError: [Errno 13] Permission denied:‘xxx.csv‘
  4. 如何在WordPress中创建优惠券弹出窗口(逐步)
  5. 基于YOLOv7的芯片表面缺陷检测系统(源码&教程)
  6. 过山洞java_山洞历险Java源代码JAVA游戏源码下载
  7. 闲鱼卖家待发货在哪看
  8. ScrollView中嵌套WebView底部留白问题解决
  9. 【快应用】折叠屏手机打开快应用页面重新加载问题
  10. opencv安装配置测试