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 BaseTrigger

class MultiCronTrigger(BaseTrigger):
    triggers = []

    def __init__(self, triggers):
        self.triggers = triggers

    def get_next_fire_time(self, previous_fire_time, now):
        min_next_fire_time = None
        for trigger in self.triggers:
            next_fire_time = trigger.get_next_fire_time(previous_fire_time, now)
            if min_next_fire_time is None:
                min_next_fire_time = next_fire_time
            if next_fire_time < min_next_fire_time:
                min_next_fire_time = next_fire_time
        return min_next_fire_time

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

import time
from datetime import datetime
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.triggers.cron import CronTrigger

def 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

时间: 2024-10-09 09:48:54

APScheduler Multi CronTrigger 实现的相关文章

APScheduler 3.0.1浅析

简介 APScheduler是一个小巧而强大的Python类库,通过它你可以实现类似Unix系统cronjob类似的定时任务系统.使用之余,阅读一下源码,一方面有助于更好的使用它,另一方面,个人认为aps的架构设计质量很高,阅读它对于提升软件开发的sense很有帮助. 组成 APScheduler整个系统可以说由这五个概念组成: scheduler:控制器,可以看做整个系统的driver,外部世界通过它来实现任务(Job)的增删改查管理.根据IO模式的不同,aps提供了多种scheduler实现

apscheduler 绿色版

由于依赖EntryPoint,因此apscheduler在离线的方式(直接拷贝然后引用)使用时,会报错. 错误信息类似: No trigger by the name “interval/cron/date” was found 原因: 基类的构造函数依赖于EntryPoint, 如下: class BaseScheduler(six.with_metaclass(ABCMeta)): //... _trigger_plugins = dict((ep.name, ep) for ep in i

python3使用pyinstaller打包apscheduler出的错

本来只是想用Python做一个定时任务小工具在服务器上运行,可是服务器在隔离区,各种禁止上外网,使用pip导出列表那种下载库的方法不管用,导致Python的各种库都下不到,官网离线下载又各种缺依赖,好气啊.后来查了一下,原来还有pyinstaller这种好东西,将需要的库和程序打包成一个可运行的程序,这正是我需要的. 为了测试pyinstaller,主要遇到了两个错误,一个是pkg_resources.DistributionNotFound,一个是ImportError: No module

APScheduler API

apscheduler.triggers.cron API Trigger alias for add_job(): cron class apscheduler.triggers.cron.CronTrigger(year=None, month=None, day=None, week=None, day_of_week=None, hour=None, minute=None, second=None, start_date=None, end_date=None, timezone=No

spring4 cronTrigger和simpleTrigger实现方法

Quartz官方网站对SimpleTrigger和CronTrigger的简单对比:      SimpleTrigger is handy if you need 'one-shot' execution (just single execution of a job at a given moment in time), or if you need to fire a job at a given time, and have it repeat N times, with a delay

cron(CronTrigger)表达式用法

CronTrigger CronTriggers往往比SimpleTrigger更有用,如果您需要基于日历的概念,而非SimpleTrigger完全指定的时间间隔,复发的发射工作的时间表.CronTrigger,你可以指定触发的时间表如“每星期五中午”,或“每个工作日9:30时”,甚至“每5分钟一班9:00和10:00逢星期一上午,星期三星期五“.即便如此,SimpleTrigger一样,CronTrigger拥有的startTime指定的时间表时生效,指定的时间表时,应停止(可选)结束时间.

【SSH项目实战】国税协同平台-34.quartz&amp;CronTrigger

我们上次使用quartz任务调度框架创建了一个在后台按照时间间隔不停运行的任务,我们使用的是simpleTrigger简单触发器,为了实现我们的月末自动回复的功能,我们要设置触发器能够在某个精确时间去自动执行任务,那么使用simpleTrigger简单触发器就远远不够了,我们需要使用CronTrigger任务触发器来实现这个功能. 我们的CronTrigger设置步骤如下: 任务触发器(CronTrigger) ① 设置任务详细 ② 设置执行时机(cronExpression) cronExpr

Guava源码分析——Multi Collections(1)

Immutable集合作为Guava提供的集合类型,并没有脱离集合的接口,例如ImmutableList依然实现List接口.但接下来几章要分析的Multi Collections则几乎脱离了JAVA原本所带的集合(这也是为什么Multixxx,代表集合数据结构的单词为小写),作为了JAVA集合的一个补充. 对于Map<T,Integer>这样的Map结构,会经常被使用到,而我们统计T出现的次数的时候,大多时候进行的操作遍历统计,代码如下所示: Map<String, Integer&g

unity, multi pass shader中的surface pass

今天尝试写一个multi pass shader,但其中有一个Pass是surface pass,总是莫名奇妙地报错.后来看到下面帖子: http://forum.unity3d.com/threads/achieving-a-multi-pass-effect-with-a-surface-shader.96393/ 此帖3楼中写道:“ You can add arbitrary passes while using a surface shader. You just stick every