APScheduler Multi CronTrigger 实现
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 实现相关推荐
- python四大软件-Python实用模块(二十)Apscheduler
软硬件环境 windows 10 64bits anaconda with python 3.7 视频看这里 前言 说起定时任务,第一反应应该是windows自带的计划任务或者linux自带的cron ...
- python利器怎么编程-Python任务调度利器之APScheduler详解
任务调度应用场景 所谓的任务调度是指安排任务的执行计划,即何时执行,怎么执行等.在现实项目中经常出现它们的身影:特别是数据类项目,比如实时统计每5分钟网站的访问量,就需要每5分钟定时从日志数据分析访问 ...
- apscheduler 绿色版
由于依赖EntryPoint,因此apscheduler在离线的方式(直接拷贝然后引用)使用时,会报错. 错误信息类似: No trigger by the name "interval/c ...
- python apscheduler 动态_基于Flask-APScheduler实现添加动态定时任务
阅读目录 一.apSheduler 二.Flask-APScheduler 三.动态定时任务 四.uwsgi部署注意事项 一.apSheduler 第一部分内容限于apSheduler3.0以下版本, ...
- Python定时任务框架APScheduler快速入门
文章目录 前言 一.安装 二.简单使用 1.代码如下(示例) 2.APScheduler 的运行流程 三.APScheduler 四组件 1.调度器(schedulers)---不同程序引用 2.任务 ...
- Redis 笔记(08)— 事务(一次执行多条命令、命令 watch/multi/exec/discard、错误处理)
1. 事务概念 Redis 中的事务 (transaction)是一组命令的集合.事务同命令一样是 Redis 的最小执行单位,一个事务中的命令要么都执行,要么都不执行.事务的原理是先将属于一个事务的 ...
- (multi)set的某些操作
(multi)set的某些操作 我们可以把multiset当作平衡树用~ 注意,必须定义小于运算符. s.begin() 返回指向第一个元素的迭代器. s.end() 返回指向最后元素的后面那个虚拟元 ...
- 在Ubuntu 16.04.1 LTS上安装XnView Multi Platform图片浏览器0.83
XnView Multi Platform是一个全平台(Windows, Linux, Mac)下的全能图片工具,类似Windows平台的美图看看,阿香婆图片浏览器等等,效果非常赞,是我在Ubuntu ...
- celery源码分析:multi命令分析
celery源码分析 本文环境python3.5.2,celery4.0.2,django1.10.x系列 celery简介 celery是一款异步任务框架,基于AMQP协议的任务调度框架.使用的场景 ...
最新文章
- Android TouchEvent 分发流程
- 增加自增列 耗时长_又一批长事务,P0故障谁来背锅?
- 多个VSTO解决方案间传输变量
- Winfrom实现圆角设计
- 对每个小组的评论和建议
- dwr框架查看外放方法_先睹为快!IntelliJ IDEA v2019.3带来的新框架和新技术
- python接口自动化测试(七)-unittest-批量用例管理
- 【Espruino】NO.06 关键是你的仆人(继续)
- PLC通讯智能网关-不用PLC编程,实现西门子PLC与罗克韦尔(AB)PLC之间数据通讯
- python生成序列_python 之 生成序列号
- 国产linux聊天软件,程序员的全平台聊天软件:Rocket.Chat
- GAS超标,以太坊告急
- 你的独立思考能力正在被它吞噬掉
- 2023年核桃仁行业产业布局:全球核桃仁产量稳步增长
- CRM项目实战第一天
- Kotin 的代理和委托
- 几种有趣的电路设计(阻容降压,防过压,LLC,PFC,正激和反激电路)
- JS的map方法和Map对象
- Sentinel-限流 冷启动
- 朝花夕拾:Eclipse断点调试
热门文章
- DNS 缓存、CDN 缓存、浏览器缓存,JVM DNS 缓存详解
- Sublime text 3 汉化 破解版
- PermissionError: [Errno 13] Permission denied:‘xxx.csv‘
- 如何在WordPress中创建优惠券弹出窗口(逐步)
- 基于YOLOv7的芯片表面缺陷检测系统(源码&教程)
- 过山洞java_山洞历险Java源代码JAVA游戏源码下载
- 闲鱼卖家待发货在哪看
- ScrollView中嵌套WebView底部留白问题解决
- 【快应用】折叠屏手机打开快应用页面重新加载问题
- opencv安装配置测试