python-定时任务-apschelduer
python-定时任务-apschelduer
1. apscheduler
1.1. install
pip install apscheduler
1.2. basic concepts
APScheduler has four kinds of components:
- triggers
- job stores
- executors
- schedulers
Your choice of scheduler depends mostly on your programming environment and what you’ll be using APScheduler for. Here’s a quick guide for choosing a scheduler:
- BlockingScheduler: use when the scheduler is the only thing running in your process
- BackgroundScheduler: use when you’re not using any of the frameworks below, and want the scheduler to run in the background inside your application
- AsyncIOScheduler: use if your application uses the asyncio module
- GeventScheduler: use if your application uses gevent
- TornadoScheduler: use if you’re building a Tornado application
- TwistedScheduler: use if you’re building a Twisted application
- QtScheduler: use if you’re building a Qt application
需要注意的是前两种方式,一为阻塞型,一为非阻塞型。具体差别见后文。
job stores主要影响作业持久化,一般情况下使用默认方式default (MemoryJobStore)足够了,如果需要持久化,可能就得需要数据库支持了,例如SQLAlchemyJobStore。
exeutors主要有ThreadPoolExecutor,ProcessPoolExecutor,默认是前者,一般够用,除非是cpu密集型作业。
APScheduler comes with three built-in trigger types:
- date: use when you want to run the job just once at a certain point of time
- interval: use when you want to run the job at fixed intervals of time
- cron: use when you want to run the job periodically at certain time(s) of day
1.2.1. 示例
schedule.add_job(func=job1,trigger='interval', seconds=1)
schedule.add_job(func=job2, args=('lierl',), trigger='date', next_run_time=datetime.datetime.now()+datetime.timedelta(seconds=5))
schedule.add_job(func=job1, trigger='cron', month='1,3,5,7-9', day='*', hour='14', minute='*')
1.3. scheduler manage
scheduler.start()
scheduler.shutdown()
scheduler.pause()
This will cause the scheduler to not wake up until processing is resumed:
scheduler.resume()
It is also possible to start the scheduler in paused state, that is, without the first wakeup call:
scheduler.start(paused=True)
1.4. job administer add /remove/pause/resume/list/modify
There are two ways to add jobs to a scheduler:
- by calling add_job()
- by decorating a function with scheduled_job()
When you remove a job from the scheduler, it is removed from its associated job store and will not be executed anymore. There are two ways to make this happen:
- by calling remove_job() with the job’s ID and job store alias
- by calling remove() on the Job instance you got from add_job()
You can easily pause and resume jobs through either the Job instance or the scheduler itself. When a job is paused, its next run time is cleared and no further run times will be calculated for it until the job is resumed. To pause a job, use either method:
To resume:
获取当前任务列表
- get_jobs():It will return a list of Job instances. If you’re only interested in the jobs contained in a particular job store, then give a job store alias as the second argument.
- print_jobs():will print out a formatted list of jobs, their triggers and next run times.
2. 基本使用
2.1. 阻塞/非阻塞
下面是一个非阻塞型的定时任务调度。
#sys
import threading
import apscheduler
import time, datetime
from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.schedulers.background import BackgroundScheduler
para = [1,2,3,4]
continue_run = True
def job1():
print('job1')
print(threading.current_thread())
print(time.strftime('%Y-%m-%d
%H:%M:%S', time.localtime()))
def job2(*args):
global para
print('job2', para)
print(threading.current_thread())
print(time.strftime('%Y-%m-%d
%H:%M:%S', time.localtime()))
def stop_runing():
global continue_run
continue_run = False
#sch = BlockingScheduler()
sch = BackgroundScheduler()
sch.add_job(job1, 'interval', seconds=5)
sch.add_job(job2, 'interval', seconds=8)
sch.add_job(stop_runing, 'date', run_date='2019-6-16
12:25:00',)
jl = sch.get_jobs() #[<Job
(id=66307271d51f451491fd7bf8e8ebfc47 name=job1)>, <Job
(id=af6ddd2c0ed94df58d889637cb7b816d name=job2)>]
sch.print_jobs()
print('main thread:', threading.current_thread())
print('before scheduler:', time.strftime('%Y-%m-%d
%H:%M:%S', time.localtime()))
sch.start()
while continue_run:
print('main')
time.sleep(10)
print('program ending.')
2.2.
执行时间问题
import threading
import apscheduler
import time, datetime
from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.schedulers.background import BackgroundScheduler
continue_run = True
def aps_schduler():
para = [1,2,3,4]
def job1():
print('job1')
print(threading.current_thread())
print(time.strftime('%Y-%m-%d
%H:%M:%S', time.localtime()))
def job2(*args,
):
print('job2', args)
print(threading.current_thread())
print(time.strftime('%Y-%m-%d
%H:%M:%S', time.localtime()))
def stop_runing():
global continue_run
continue_run = False
#sch =
BlockingScheduler()
sch =
BackgroundScheduler()
# 添加定时任务
sch.add_job(job1, 'interval', seconds=5)
sch.add_job(job2, 'interval', seconds=8, args=['text'])
# 1分钟后执行stop_running
sch.add_job(stop_runing,
'date', run_date=time.strftime( '%Y-%m-%d
%H:%M:%S', time.localtime(time.time()+60)))
jl =
sch.get_jobs() #[<Job (id=66307271d51f451491fd7bf8e8ebfc47 name=job1)>,
<Job (id=af6ddd2c0ed94df58d889637cb7b816d name=job2)>]
sch.print_jobs()
print('main
thread:', threading.current_thread())
print('before
scheduler:', time.strftime('%Y-%m-%d %H:%M:%S',
time.localtime()))
sch.start()
while continue_run:
print('main')
time.sleep(10)
print('program
ending.')
aps_schduler()
2.3.
超时问题
如果使用非阻塞模式,不存在超时问题,每次都会启一个新线程,直到达到max_instances给出的限制。
这里把实例限制设为1:
Execution of job
"aps_schduler.<locals>.job1 (trigger: interval[0:00:03], next run
at: 2019-06-16 16:19:35 CST)" skipped: maximum number of running instances
reached (1)
每次调度启动任务时冲突,会抛出一个异常信息,但不会终止执行;否则正常进行。
示例代码:
import threading
import apscheduler
import time, datetime
from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.schedulers.background import BackgroundScheduler
continue_run = True
def aps_schduler():
para = [1,2,3,4]
count_x = 1
def job1():
nonlocal count_x
count_x +=1
print('job1')
print(threading.current_thread())
print(time.strftime('%Y-%m-%d
%H:%M:%S', time.localtime()))
time.sleep(15)
print(count_x)
def stop_runing():
global continue_run
continue_run = False
sch =
BackgroundScheduler()
# 添加定时任务
sch.add_job(job1, 'interval', seconds=3, max_instances=1)
# 1分钟后执行stop_running
sch.add_job(stop_runing,
'date', run_date=time.strftime( '%Y-%m-%d
%H:%M:%S', time.localtime(time.time()+60)))
print('main
thread:', threading.current_thread())
print('before
scheduler:', time.strftime('%Y-%m-%d %H:%M:%S',
time.localtime()))
sch.start()
while continue_run:
print('main')
time.sleep(5)
print('program
ending.')
aps_schduler()
2.4.
首次执行时间问题
与twisted的定时任务类似,它也不会在一开始就执行;
除非指定:
sch.add_job(job1, 'interval', seconds=5, max_instances=1, next_run_time=datetime.datetime.now())
当然,在开始定时任务前手动执行一次也是可行的。
2.5.
其它设置
任务多实例
add_job有max_instances参数可以控制多任务实例
3.
api
3.1.
date apscheduler.triggers.date
from datetime import date
from apscheduler.schedulers.blocking import BlockingScheduler
sched = BlockingScheduler()
def my_job(text):
print(text)
# The job will be executed
on November 6th, 2009
sched.add_job(my_job, 'date', run_date=date(2009, 11, 6), args=['text'])
sched.start()
You can specify the exact time when the job should be run:
# 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'])
The run date can be given as text too:
sched.add_job(my_job, 'date', run_date='2009-11-06 16:30:05', args=['text'])
To add a job to be run immediately:
# The 'date' trigger and
datetime.now() as run_date are implicit
sched.add_job(my_job, args=['text'])
4.
参考文档
参考文档:
https://apscheduler.readthedocs.io/en/latest/userguide.html#starting-the-scheduler
5.
testing code
5.1.
example1
import threading
import apscheduler
import time, datetime
from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.schedulers.background import BackgroundScheduler
continue_run = True
def aps_schduler():
para = [1,2,3,4]
count_x = 1
def job1():
nonlocal count_x
count_x +=1
print('job1')
print(threading.current_thread())
print(time.strftime('%Y-%m-%d
%H:%M:%S', time.localtime()))
#time.sleep(15)
print(count_x)
def stop_runing():
global continue_run
continue_run = False
sch =
BackgroundScheduler()
# 添加定时任务
sch.add_job(job1, 'interval', seconds=5, max_instances=1, next_run_time=datetime.datetime.now())
# 1分钟后执行stop_running
sch.add_job(stop_runing,
'date', run_date=time.strftime( '%Y-%m-%d
%H:%M:%S', time.localtime(time.time()+60)))
print('main
thread:', threading.current_thread())
print('before
scheduler:', time.strftime('%Y-%m-%d %H:%M:%S',
time.localtime()))
sch.start()
while continue_run:
#print('main')
time.sleep(5)
print('program
ending.')
aps_schduler()
python-定时任务-apschelduer的更多相关文章
- Python定时任务框架APScheduler 3.0.3 Cron示例
APScheduler是基于Quartz的一个Python定时任务框架,实现了Quartz的所有功能,使用起来十分方便.提供了基于日期.固定时间间隔以及crontab类型的任务,并且可以持久化任务.基 ...
- python 定时任务
Python 定时任务 最近学习到了 python 中两种开启定时任务的方法,和大家分享一下心得. sched.scheduler() threading.Timer() sched 定时任务 使用s ...
- Python定时任务框架APScheduler
http://blog.csdn.net/chosen0ne/article/details/7842421 APScheduler是基于Quartz的一个Python定时任务框架,实现了Quartz ...
- Python定时任务
在项目中,我们可能遇到有定时任务的需求.其一:定时执行任务.例如每天早上 8 点定时推送早报.其二:每隔一个时间段就执行任务.比如:每隔一个小时提醒自己起来走动走动,避免长时间坐着.今天,我跟大家分享 ...
- [Dynamic Language] Python定时任务框架
APScheduler是一个Python定时任务框架,使用起来十分方便.提供了基于日期.固定时间间隔以及crontab类型的任务,并且可以持久化任务.并以daemon方式运行应用. 在APSchedu ...
- [转]Python定时任务框架APScheduler
APScheduler是基于Quartz的 一个Python定时任务框架,实现了Quartz的所有功能,使用起来十分方便.提供了基于日期.固定时间间隔以及crontab类型的任务,并且可以 持久化任务 ...
- Python 定时任务的实现方式
本文转载自: https://lz5z.com/Python%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1%E7%9A%84%E5%AE%9E%E7%8E%B0%E6%96% ...
- Python 定时任务框架 APScheduler 详解
APScheduler 最近想写个任务调度程序,于是研究了下 Python 中的任务调度工具,比较有名的是:Celery,RQ,APScheduler. Celery:非常强大的分布式任务调度框架 R ...
- python 定时任务APScheduler 使用介绍
python 定时任务APScheduler 使用介绍 介绍: APScheduler的全称是Advanced Python Scheduler.它是一个轻量级的 Python 定时任务调度框架. ...
- APScheduler(python 定时任务框架)最简单使用教程
有时候需要部署一些很简单的python定时任务,使用APScheduler是很好的选择.只需要简单的设置几个参数,就可以实现定时.定分甚至秒来跑. 第一步:用pip安装APScheduler pip ...
随机推荐
- 概率dp (背包+概率) 背包的多一点
题意:XX想抢劫银行,当危险率低于P的时候才能行动,现在给出每家银行的金钱mi和危险率pi,求最多能获得多少金钱: 题解:危险率是P,那么安全率就是1-P,那么XX抢劫的所有银行的安全率之积就不能小于 ...
- [单片机] ESP8266 开机自动透传
AT+CWMODE=1//设置WiFi工作在透传模式 AT+CWJAP_DEF="XX","YYY"//设置要链接的wifi名称.密码,并进行连接 //设置TC ...
- Codeforces Round #610 (Div. 2)E(模拟,DFS)
先找到一条多边形的边,然后循环一圈输出多边形上的点.把每个三角形看作一个结点,以两个三角形之间公用边为边建立一张图,DFS输出叶子结点,则得到先切后切的顺序. #define HAVE_STRUCT_ ...
- js 页面滚动到指定位置
当页面的长度比较长时,如果进行刷新页面,我们希望能够在刷新完成页面之后,能够停留在当前位置,而不是从头再手动滚动到当前位置. 那么这样的效果如何实现呢?下面开始简单描写(由于博客园不支持效果展示,所以 ...
- Spring中如何使用工厂模式实现程序解耦?
目录 1. 啥是耦合.解耦? 2. jdbc程序进行解耦 3.传统dao.service.controller的程序耦合性 4.使用工厂模式实现解耦 5.工厂模式改进 6.结语 @ 1. 啥是耦合.解 ...
- 基于JSP开发手机销售购物商城系统
开发环境: Windows操作系统开发工具:Eclipse+Jdk+Tomcat+MySQL数据库 运行效果图: 源码及原文链接:https://javadao.xyz/forum.php?mod=v ...
- VMware安装ACS5.8
1.所需组件: VMware ACS5.8 iso 2.安装要求: 2 Core Processor 4 GB RAM 60 GB Hard drive 这些要求算是比较低的要求,不能比这个更low了 ...
- Tiny-shell
Tiny-shell:一个模仿bash的极简shell (一) 概述 通过构建一个简单的shell,能够对shell的工作原理进行一些了解.主要有: 重定向 流水线 前台信号处理 进程组 后台进程 作 ...
- Spring bean的bean的三种实例化方式
Bean 定义 被称作 bean 的对象是构成应用程序的支柱也是由 Spring IoC 容器管理的.bean 是一个被实例化,组装,并通过 Spring IoC 容器所管理的对象.这些 bean ...
- socketserver tcp黏包
socket (套接字) tcp(黏包现象原因) 传输中由于内核区缓冲机制(等待时间,文件大小),会在 发送端 缓冲区合并连续send的数据,也会出现在 接收端 缓冲区合并recv的数据给指定port ...