APScheduler是一个Python定时任务框架,使用起来十分方便。提供了基于日期、固定时间间隔以及crontab类型的任务,并且可以持久化任务、并以daemon方式运行应用。

在APScheduler中有四个组件:
触发器(trigger)包含调度逻辑,每一个作业有它自己的触发器,用于决定接下来哪一个作业会运行。除了他们自己初始配置意外,触发器完全是无状态的。
作业存储(job store)存储被调度的作业,默认的作业存储是简单地把作业保存在内存中,其他的作业存储是将作业保存在数据库中。一个作业的数据讲在保存在持久化作业存储时被序列化,并在加载时被反序列化。调度器不能分享同一个作业存储。


执行器(executor)处理作业的运行,他们通常通过在作业中提交制定的可调用对象到一个线程或者进城池来进行。当作业完成时,执行器将会通知调度器。
调度器(scheduler)是其他的组成部分。你通常在应用只有一个调度器,应用的开发者通常不会直接处理作业存储、调度器和触发器,相反,调度器提供了处理这些的合适的接口。配置作业存储和执行器可以在调度器中完成,例如添加、修改和移除作业。


你需要选择合适的调度器,这取决于你的应用环境和你使用APScheduler的目的。通常最常用的两个:
– BlockingScheduler: 当调度器是你应用中唯一要运行的东西时使用。
– BackgroundScheduler: 当你不运行任何其他框架时使用,并希望调度器在你应用的后台执行。

测试计划任务

mac-abeen:timetask abeen$ vim testtask.py

   1 # !/usr/bin/env python
2 # -*- encoding:utf-8 -*-
3
4 from datetime import datetime
5
6
7 class TestTask(object):
8 """
9 测试计划任务
10 """
11
12 def print_file(self, content):
13 f = open("testtask.log", "a")
14 f.write(content)
15 f.close()
16
17
18 def run_second(self):
19 self.print_file("run_second is run on {0} \r\n ".format(datetime.now()))
20
21
22 def run_minute(self):
23 self.print_file("run_minute is run on {0} \r\n ".format(datetime.now()))
24
25
26
27
28 if __name__ == "__main__":
29 tt = TestTask()
30 tt.run_second()
31 tt.run_minute()

任务执行
mac-abeen:timetask abeen$ vim run_task.py

   1 # !/usr/bin/env python
2 # -*- encoding:utf-8 -*-
3
4 from datetime import datetime
5 import time
6 from apscheduler.schedulers.blocking import BlockingScheduler
7 from testtask import TestTask
8
9 def run():
10 scheduler = BlockingScheduler()
11 scheduler.add_job(func=TestTask().run_second, trigger='interval', seconds=3)
12 scheduler.add_job(func=TestTask().run_minute, trigger='interval', seconds=60)
13
14 scheduler.start()
15
16
17 if __name__ == "__main__":
18 print "scheduler is run ......"
19 run()

日志记录(测试部分日志信息)

1 run_second is run on 2017-06-29 15:13:16.070406
2 run_minute is run on 2017-06-29 15:13:16.071498
3 run_second is run on 2017-06-29 15:13:32.378192
...
22 run_minute is run on 2017-06-29 15:14:29.379333
23 run_second is run on 2017-06-29 15:14:29.379462
24 run_second is run on 2017-06-29 15:14:32.380961
...
44 run_minute is run on 2017-06-29 15:15:29.380135
45 run_second is run on 2017-06-29 15:15:32.380093
46 run_second is run on 2017-06-29 15:15:35.378075
....

作业运行的控制

add_job的第二个参数是trigger,它管理着作业的调度方式。它可以为date, interval或者cron。对于不同的trigger,对应的参数也相同。

(1). cron定时调度

year(int|str) – 4-digit year

month(int|str) – month (1-12)

day(int|str) – day of the (1-31)

week(int|str) – ISO week (1-53)

day_of_week(int|str) – number or name of weekday (0-6 or mon,tue,wed,thu,fri,sat,sun)

hour(int|str) – hour (0-23)

minute(int|str) – minute (0-59)

second(int|str) – second (0-59)

start_date(datetime|str) – earliest possible date/time to trigger on (inclusive)

end_date(datetime|str) – latest possible date/time to trigger on (inclusive)

timezone(datetime.tzinfo|str) – time zone to use for the date/time calculations (defaults to scheduler timezone)

和Linux的Crontab一样,它的值格式为:

Expression Field Description
* any Fire on every value
*/a any Fire every  values, starting from the minimum 
a-b any Fire on any value within the  a-b range (a must be smaller than b) 
a-b/c any Fire every  values within the  a-b range 
xth y day Fire on the  -th occurrence of weekday  within the month 
last x day Fire on the last occurrence of weekday  within the month 
last day Fire on the last day within the month
x,y,z any Fire on any matching expression; can combine any number of any of the above expressions

几个例子如下:

# The job will be executed on November 6th, 2009
sched.add_job(my_job, 'date', run_date=date(2009, 11, 6), args=['text'])
# The job will be executed on November 6th, 2009 at 16:30:05
sched.add_job(my_job, 'date', run_date=datetime(2009, 11, 6, 16, 30, 5), args=['text'])

(2). interval 间隔调度

它的参数如下:

weeks(int) – number of weeks to wait

days(int) – number of days to wait

hours(int) – number of hours to wait

minutes(int) – number of minutes to wait

seconds(int) – number of seconds to wait

start_date(datetime|str) – starting point for the interval calculation

end_date(datetime|str) – latest possible date/time to trigger on

timezone(datetime.tzinfo|str) – time zone to use for the date/time calculations

例子:

# Schedule job_function to be called every two hours
sched.add_job(job_function, 'interval', hours=2)

(3). date 定时调度

最基本的一种调度,作业只会执行一次。它的参数如下:

run_date(datetime|str) – the date/time to run the job at

timezone(datetime.tzinfo|str) – time zone for run_date if it doesn’t have one already

例子:

# The job will be executed on November 6th, 2009
sched.add_job(my_job, 'date', run_date=date(2009, 11, 6), args=['text'])
# The job will be executed on November 6th, 2009 at 16:30:05
sched.add_job(my_job, 'date', run_date=datetime(2009, 11, 6, 16, 30, 5), args=['text'])

官方资料帮助:
https://pypi.python.org/pypi/APScheduler/#downloads

https://github.com/agronholm/apscheduler

[Dynamic Language] Python定时任务框架的更多相关文章

  1. Python定时任务框架APScheduler 3.0.3 Cron示例

    APScheduler是基于Quartz的一个Python定时任务框架,实现了Quartz的所有功能,使用起来十分方便.提供了基于日期.固定时间间隔以及crontab类型的任务,并且可以持久化任务.基 ...

  2. Python定时任务框架APScheduler

    http://blog.csdn.net/chosen0ne/article/details/7842421 APScheduler是基于Quartz的一个Python定时任务框架,实现了Quartz ...

  3. [转]Python定时任务框架APScheduler

    APScheduler是基于Quartz的 一个Python定时任务框架,实现了Quartz的所有功能,使用起来十分方便.提供了基于日期.固定时间间隔以及crontab类型的任务,并且可以 持久化任务 ...

  4. Python 定时任务框架 APScheduler 详解

    APScheduler 最近想写个任务调度程序,于是研究了下 Python 中的任务调度工具,比较有名的是:Celery,RQ,APScheduler. Celery:非常强大的分布式任务调度框架 R ...

  5. 分布式定时任务框架——python定时任务框架APScheduler扩展

    http://bbs.7boo.org/forum.php?mod=viewthread&tid=14546 如果将定时任务部署在一台服务器上,那么这个定时任务就是整个系统的单点,这台服务器出 ...

  6. python 定时任务框架apscheduler

    文章目录 安装 基本概念介绍 调度器的工作流程 实例1 -间隔性任务 实例2 - cron 任务 配置调度器 方法一 方法二 方法三: 启动调度器 方法一:使用默认的作业存储器: 方法二:使用数据库作 ...

  7. APScheduler(python 定时任务框架)最简单使用教程

    有时候需要部署一些很简单的python定时任务,使用APScheduler是很好的选择.只需要简单的设置几个参数,就可以实现定时.定分甚至秒来跑. 第一步:用pip安装APScheduler pip ...

  8. [Dynamic Language] Python非子包引用

    Python非子包引用 python的搜索路径其实是一个列表(sys.path) 导入模块时python会自动去找搜索这个列表当中的路径,如果路径中存在要导入的模块文件则导入成功. 在项目中如果要引用 ...

  9. [Python]定时任务框架 APScheduler

    1.使用APScheduler教程 参考博客地址

随机推荐

  1. go语言版本变化

    The Go Project     Go is an open source project developed by a team at Google and many contributors  ...

  2. python网络编程-进程锁

    一:进程锁的作用 进程锁是防止多进程并发执行在屏幕打印的时候,其他进程也输出数据到屏幕,而出现混乱现象. 比如:进程池中很多进程会向同一个日志文件中打印日志 二:代码 # -*- coding:utf ...

  3. C++类指针类型的成员变量的浅复制与深复制

    本篇文章旨在阐述C++类的构造,拷贝构造,析构机制,以及指针成员变量指针悬空问题的解决.需要读者有较好的C++基础,熟悉引用,const的相关知识. 引言: 类作为C++语言的一种数据类型,是对C语言 ...

  4. gif处理

    UleadGIFAnimator-v5.05破解版 网盘地址:https://pan.baidu.com/s/1bpf6iVP 2017-02-19  10:39:58

  5. Zabbix监控websphere和weblogic

    本节内容 zabbix java gateway 配置和运行java gateway 配置zabbix server使用java gateway 调整java gateway的日志级别 监控weblo ...

  6. oracle查看所有表及各表行数

    https://zhidao.baidu.com/question/131972827.html

  7. mac系统编译安装ImageMagick7.0.1-3

    1.下载源码包: git clone http://git.imagemagick.org/repos/ImageMagick.git 2.编译安装: cd ImageMagick/ ./config ...

  8. 基于Json.NET自己实现MVC中的JsonValueProviderFactory

    写了博文ASP.NET MVC 3升级至MVC 5.1的遭遇:“已添加了具有相同键的项”之后,继续看着System.Web.Mvc.JsonValueProviderFactory的开源代码. 越看越 ...

  9. HashMap 在 Java1.7 与 1.8 中的区别

    hashMap 数据结构 如上图所示,JDK7之前hashmap又叫散列链表:基于一个数组以及多个链表的实现,hash值冲突的时候,就将对应节点以链表的形式存储. JDK8中,当同一个hash值(Ta ...

  10. Linux 下开发环境的搭建(软件安装)

    一.Centos6.5下安装JDK 步骤1: 查看现有安装的JDK版本 rpm –qa | grep -i java 步骤2: 卸载已有软件 rpm -e --nodeps java-1.7.0-op ...