python apscheduler执行_Python下定时任务框架APScheduler的使用

今天准备实现一个功能需要用到定时执行任务,所以就看到了Python的一个定时任务框架APScheduler,试了一下感觉还不错。

1.APScheduler简介:

APScheduler是Python的一个定时任务框架,可以很方便的满足用户定时执行或者周期执行任务的需求,它提供了基于日期date、固定时间间隔interval 、以及类似于Linux上的定时任务crontab类型的定时任务。并且该框架不仅可以添加、删除定时任务,还可以将任务存储到数据库中,实现任务的持久化,所以使用起来非常方便。

2.APScheduler安装:

APScheduler的安装相对来说也非常简单,可以直接利用pip安装,如果没有pip可以下载源码,利用源码安装。

1).利用pip安装:(推荐)# pip install apscheduler# python setup.py install

3.基本概念

APScheduler有四种组件及相关说明:

1) triggers(触发器):触发器包含调度逻辑,每一个作业有它自己的触发器,用于决定接下来哪一个作业会运行,除了他们自己初始化配置外,触发器完全是无状态的。

2)job stores(作业存储):用来存储被调度的作业,默认的作业存储器是简单地把作业任务保存在内存中,其它作业存储器可以将任务作业保存到各种数据库中,支持MongoDB、Redis、SQLAlchemy存储方式。当对作业任务进行持久化存储的时候,作业的数据将被序列化,重新读取作业时在反序列化。

3) executors(执行器):执行器用来执行定时任务,只是将需要执行的任务放在新的线程或者线程池中运行。当作业任务完成时,执行器将会通知调度器。对于执行器,默认情况下选择ThreadPoolExecutor就可以了,但是如果涉及到一下特殊任务如比较消耗CPU的任务则可以选择ProcessPoolExecutor,当然根据根据实际需求可以同时使用两种执行器。

4) schedulers(调度器):调度器是将其它部分联系在一起,一般在应用程序中只有一个调度器,应用开发者不会直接操作触发器、任务存储以及执行器,相反调度器提供了处理的接口。通过调度器完成任务的存储以及执行器的配置操作,如可以添加。修改、移除任务作业。

APScheduler提供了多种调度器,可以根据具体需求来选择合适的调度器,常用的调度器有:

BlockingScheduler:适合于只在进程中运行单个任务的情况,通常在调度器是你唯一要运行的东西时使用。

BackgroundScheduler: 适合于要求任何在程序后台运行的情况,当希望调度器在应用后台执行时使用。

AsyncIOScheduler:适合于使用asyncio框架的情况

GeventScheduler: 适合于使用gevent框架的情况

TornadoScheduler: 适合于使用Tornado框架的应用

TwistedScheduler: 适合使用Twisted框架的应用

QtScheduler: 适合使用QT的情况

4.配置调度器

APScheduler提供了许多不同的方式来配置调度器,你可以使用一个配置字典或者作为参数关键字的方式传入。你也可以先创建调度器,再配置和添加作业,这样你可以在不同的环境中得到更大的灵活性。

1)下面一个简单的示例:import time

from apscheduler.schedulers.blocking import BlockingScheduler

def test_job():

print time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))

scheduler = BlockingScheduler()

'''

#该示例代码生成了一个BlockingScheduler调度器,使用了默认的默认的任务存储MemoryJobStore,以及默认的执行器ThreadPoolExecutor,并且最大线程数为10。

'''

scheduler.add_job(test_job, 'interval', seconds=5, id='test_job')

'''

#该示例中的定时任务采用固定时间间隔(interval)的方式,每隔5秒钟执行一次。

#并且还为该任务设置了一个任务id

'''

scheduler.start()

2)如果想执行一些复杂任务,如上边所说的同时使用两种执行器,或者使用多种任务存储方式,并且需要根据具体情况对任务的一些默认参数进行调整。可以参考下面的方式。(http://apscheduler.readthedocs.io/en/latest/userguide.html)

第一种方式:from pytz import utc

from apscheduler.schedulers.background import BackgroundScheduler

from apscheduler.jobstores.mongodb import MongoDBJobStore

from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore

from apscheduler.executors.pool import ThreadPoolExecutor, ProcessPoolExecutor

jobstores = {

'mongo': MongoDBJobStore(),

'default': SQLAlchemyJobStore(url='sqlite:///jobs.sqlite')

}

executors = {

'default': ThreadPoolExecutor(20),

'processpool': ProcessPoolExecutor(5)

}

job_defaults = {

'coalesce': False,

'max_instances': 3

}

scheduler = BackgroundScheduler(jobstores=jobstores, executors=executors, job_defaults=job_defaults, timezone=utc)

第二种方式:from apscheduler.schedulers.background import BackgroundScheduler

# The "apscheduler." prefix is hard coded

scheduler = BackgroundScheduler({

'apscheduler.jobstores.mongo': {

'type': 'mongodb'

},

'apscheduler.jobstores.default': {

'type': 'sqlalchemy',

'url': 'sqlite:///jobs.sqlite'

},

'apscheduler.executors.default': {

'class': 'apscheduler.executors.pool:ThreadPoolExecutor',

'max_workers': '20'

},

'apscheduler.executors.processpool': {

'type': 'processpool',

'max_workers': '5'

},

'apscheduler.job_defaults.coalesce': 'false',

'apscheduler.job_defaults.max_instances': '3',

'apscheduler.timezone': 'UTC',

})

第三种方式:from pytz import utc

from apscheduler.schedulers.background import BackgroundScheduler

from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore

from apscheduler.executors.pool import ProcessPoolExecutor

jobstores = {

'mongo': {'type': 'mongodb'},

'default': SQLAlchemyJobStore(url='sqlite:///jobs.sqlite')

}

executors = {

'default': {'type': 'threadpool', 'max_workers': 20},

'processpool': ProcessPoolExecutor(max_workers=5)

}

job_defaults = {

'coalesce': False,

'max_instances': 3

}

scheduler = BackgroundScheduler()

# .. do something else here, maybe add jobs etc.

scheduler.configure(jobstores=jobstores, executors=executors, job_defaults=job_defaults, timezone=utc)

5.对任务作业的基本操作:

1).添加作业有两种方式:第一种可以直接调用add_job(),第二种使用scheduled_job()修饰器。

而add_job()是使用最多的,它可以返回一个apscheduler.job.Job实例,因而可以对它进行修改或者删除,而使用修饰器添加的任务添加之后就不能进行修改。

例如使用add_job()添加作业:#!/usr/bin/env python

#-*- coding:UTF-8

import time

import datetime

from apscheduler.schedulers.blocking import BlockingScheduler

def job1(f):

print time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())), f

def job2(arg1, args2, f):

print f, args1, args2

def job3(**args):

print args

'''

APScheduler支持以下三种定时任务:

cron: crontab类型任务

interval: 固定时间间隔任务

date: 基于日期时间的一次性任务

'''

scheduler = BlockingScheduler()

#循环任务示例

scheduler.add_job(job1, 'interval', seconds=5, args=('循环',), id='test_job1')

#定时任务示例

scheduler.add_job(job1, 'cron', second='*/5', args=('定时',), id='test_job2')

#一次性任务示例

scheduler.add_job(job1, next_run_time=(datetime.datetime.now() + datetime.timedelta(seconds=10)), args=('一次',), id='test_job3')

'''

传递参数的方式有元组(tuple)、列表(list)、字典(dict)

注意:不过需要注意采用元组传递参数时后边需要多加一个逗号

'''

#基于list

scheduler.add_job(job2, 'interval', seconds=5, args=['a','b','list'], id='test_job4')

#基于tuple

scheduler.add_job(job2, 'interval', seconds=5, args=('a','b','tuple',), id='test_job5')

#基于dict

scheduler.add_job(job3, 'interval', seconds=5, kwargs={'f':'dict', 'a':1,'b':2}, id='test_job7')

print scheduler.get_jobs()

scheduler.start()

#带有参数的示例

scheduler.add_job(job2, 'interval', seconds=5, args=['a','b'], id='test_job4')

scheduler.add_job(job2, 'interval', seconds=5, args=('a','b',), id='test_job5')

scheduler.add_job(job3, 'interval', seconds=5, kwargs={'a':1,'b':2}, id='test_job6')

print scheduler.get_jobs()

scheduler.start()

或者使用scheduled_job()修饰器来添加作业:@sched.scheduled_job('cron', second='*/5' ,id='my_job_id',)

def test_task():

print("Hello world!")

2).获得任务列表:

可以通过get_jobs方法来获取当前的任务列表,也可以通过get_job()来根据job_id来获得某个任务的信息。并且apscheduler还提供了一个print_jobs()方法来打印格式化的任务列表。

例如:scheduler.add_job(my_job, 'interval', seconds=5, id='my_job_id' name='test_job')

print scheduler.get_job('my_job_id')

print scheduler.get_jobs()

3).修改任务:

修改任务任务的属性可以使用apscheduler.job.Job.modify()或者modify_job()方法,可以修改除了id的其它任何属性。

例如:job = scheduler.add_job(my_job, 'interval', seconds=5, id='my_job' name='test_job')

job.modify(max_instances=5, name='my_job')

4).删除任务:

删除调度器中的任务有可以用remove_job()根据job ID来删除指定任务或者使用remove(),如果使用remove()需要事先保存在添加任务时返回的实例对象,任务删除后就不会在执行。

注意:通过scheduled_job()添加的任务只能使用remove_job()进行删除。

例如:job = scheduler.add_job(my_job, 'interval', seconds=5, id='my_job_id' name='test_job')

job.remove()

或者scheduler.add_job(my_job, 'interval', seconds=5, id='my_job_id' name='test_job')

scheduler.remove_job('my_job')

5).暂停与恢复任务:

暂停与恢复任务可以直接操作任务实例或者调度器来实现。当任务暂停时,它的运行时间会被重置,暂停期间不会计算时间。

暂停任务:apscheduler.job.Job.pause()

apscheduler.schedulers.base.BaseScheduler.pause_job()

恢复任务apscheduler.job.Job.resume()

apscheduler.schedulers.BaseScheduler.resume_job()

6).启动调度器

可以使用start()方法启动调度器,BlockingScheduler需要在初始化之后才能执行start(),对于其他的Scheduler,调用start()方法都会直接返回,然后可以继续执行后面的初始化操作。

例如:from apscheduler.schedulers.blocking import BlockingScheduler

def my_job():

print "Hello world!"

scheduler = BlockingScheduler()

scheduler.add_job(my_job, 'interval', seconds=5)

scheduler.start()

7).关闭调度器:

使用下边方法关闭调度器:scheduler.shutdown()

默认情况下调度器会关闭它的任务存储和执行器,并等待所有正在执行的任务完成,如果不想等待,可以进行如下操作:scheduler.shutdown(wait=False)

注意:

当出现No handlers could be found for logger “apscheduler.scheduler”次错误信息时,说明没有

logging模块的logger存在,所以需要添加上,对应新增内容如下所示(仅供参考):import logging

logging.basicConfig(level=logging.DEBUG,

format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',

datafmt='%a, %d %b %Y %H:%M:%S',

filename='/var/log/aaa.txt',

filemode='a')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/244346.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle trace发起用户,Oracle 使用TRACE进行SQL性能分析

设置sql_trace参数为true会对整个实例进行跟踪,包括所有进程:用户进程和后台进程,会造成比较严重的性能问题,生产环境一定要慎设置sql_trace参数为true会对整个实例进行跟踪,包括所有进程:用户进程和后台进…

python画二次函数图像的顶点_画二次函数图像的步骤

画二次函数图像的步骤2019-11-14 09:26:25文/叶丹画二次函数图像的步骤:五点法是选五个极其重要的点,分别为顶点、与x轴的交点、与y轴的交点及其关于对称轴的对称点,然后根据这五点作图。二次函数的画法五点法五点草图法又被叫做五点作图法是…

php rss xml,php 一个完全面向对象的RSS/XML类的简单示例

这篇文章主要为大家详细介绍了php 一个完全面向对象的RSS/XML类的简单示例,具有一定的参考价值,可以用来参考一下。感兴趣的小伙伴,下面一起跟随512笔记的小编罗X来看看吧。经测试代码如下:/*** RSS/XML类** param* arrange (512.…

zynq中mgtx应用_基于ZYNQ的UCOS移植(TCP通讯)

周五在某小徐处借到了一块Zedboard开发板,平时在公司没有机会做SDK开发的笔记,今天就趁着这块开发板简要记录一些SDK的基本操作。一、功能简介通过第三方库创建SDK工程在ZYNQ-UCOS中实现TCP echo通讯二、配置需求操作系统Windows 10(64位)开发环境SDK 20…

oracle主机名的脚本,一个开启Oracle服务和更改主机名的脚本-Oracle

一个开启Oracle服务和更改主机名的脚本真不知道该起一个什么题目,这是昨天数据库老师提出的问题。由于实验室的机器都装了还原卡,每次开机或重启都会回到初始状态,所以数库的listener.ora、tnsnames.ora文件里的host不是本机的计算机名&#…

python中的字体英文名_对python opencv 添加文字 cv2.putText 的各参数介绍

如下所示:cv2.putText(img, str(i), (123,456)), font, 2, (0,255,0), 3)各参数依次是:图片,添加的文字,左上角坐标,字体,字体大小,颜色,字体粗细其中字体可以选择FONT_HERSHEY_SIMP…

oracle备份 ram,Oracle备份时出现AIX系统的3D32B80D错误

环境:数据库: AIX5.3下的64位Oracle 10.2.0.1.0TSM5.4:Windows2003带库:IBM3100问题描述:1、aix系统出现3D32B80D错误。如下:JTXXDBS01:> errpt |moreIDENTIFIER TIMESTAMPT C RESOURCE_NAMEDESCRIPTION3D32B80D020…

python僵尸进程和孤儿进程_python学习笔记——孤儿进程和僵尸进程

1 基本概述1.1 孤儿进程和僵尸进程父进程创建子进程后,较为理想状态是子进程结束,父进程回收子进程并释放子进程占有的资源;而实际上,父子进程是异步过程,两者谁先结束是无顺的,一般可以通过父进程调用wait…

linux weblogic启动目录,Linux下WebLogic开机启动设置

为了方便管理,可以写一个启动脚本用来启动weblogic,方法如下:用root用户登录Linux,打开目录/etc/rc.d/init.d,新建一个空文本文件,名称改为weblogic(此文件名为将来的服务名,可自定义,最好以域名…

算法描述怎么写_管件材料描述怎么写

通过以上及其我们了解到了管道上不同的管道元件,包括:弯头、三通、异径管、管帽等。但在材料等级表中如何清楚的描述它们的特性,至关重要,因为这涉及材料采购是否正确。以下主要介绍管件材料描述的写法:①弯头 ②DN15~…

linux复制文件通信方式,Linux分布式文件拷贝

在开发过程中总会遇到这种情况,就是需要将一个文件从一个机器拷贝到其他的很多台机器中,最简单的方法是用U盘拷出来再一个一个机器的插进去拷贝,另一张方法则是利用飞鸽传书或者QQ等工具传输,但是都不是很方便,因为每次…

python矩阵施密特标准型_矩阵与数值计算(3)——Schur标准型和Jordan分解

前言之前介绍过几种矩阵分解方法,都可以有效的提升矩阵方程的数值求解问题,其中LU分解尤其适合于中小型、稠密矩阵的求解问题。我们最理想的矩阵就是可相似对角化的矩阵,直接可以分解成两个酉矩阵和一个对角矩阵的形式,那么如果一…

安装linux修复系统文件夹,误删除 Linux 系统文件了?这个方法教你解决

误删除linux系统文件了?不用急,本文将给你一个恢复linux文件的方法,让你轻松应对运维中的各风险问题。方法总比问题多~说在前面的话针对日常维护操作,难免会出现文件误删除的操作。大家熟知linux文件系统不同win有回收站,删除后的…

python亲和度_数据挖掘——亲和性分析

亲和性分析根据样本个体之间的相似度,确定它们关系的亲疏。应用场景:1.向网站用户提供多样化的服务或投放定向广告。2.为了向用户推荐电影或商品3.根据基因寻找有亲缘关系的人比如:统计顾客购买了商品1,然后再购买商品2的比率,算相…

linux 命令 考试,linux常用命令总结-第一次考试

1.1 mkdir创建目录语法:cat [选项] [文件名]选项:-p 多层目录创建-v 每次创建新目录都显示信息范例:1.创建多层嵌套目录[rootns2 tmp]# mkdir -pv /tmp/test/file/newmkdir: 已创建目录 "/tmp/test"mkdir: 已创建目录 "/t…

onvif python 音视频_python3控制基于onvif的安防摄像头

参考链接:一、python3控制基于onvif的安防摄像头使用的是tp-link安防摄像头安装在Python3中,是安装pip install onvif-zeep实现控制二、实现已经保证了摄像头具有的以下的能力,所以不再对设备是否具有能力进行判断。实现获取设备、控制设备、…

python fact函数_第5天:Python 函数

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段,所以我经常说函数是程序员规模化使用的基础。函数能提高应用的模块性,和代码的重复利用率。在程序设计中,常将一些常用的功能模块编写成函…

linux编写日志接口so,linux下动态链接问题(.so文件的编写与调用) .

.o 就相当于windows里的obj文件.a 是好多个.o合在一起,用于静态连接.so 是shared object,用于动态连接的,和dll差不多sotest.c#includeint test(int a){printf("#########:%d\n",a);return a;}//test.c#include int test(int a);int main(int argc,char argv[]){int …

python获取包下的所有对象_Python访问COM对象的comtypes包简介

Python访问COM对象的comtypes包简介虽然pywin32包中包含的派遣高级客户端支持基于COM接口,它是无法访问COM 对象,除非他们在C 封装代码自定义COM接口。在Python中是无法直接访问COM对象接口,需要借助专门访问的COM包:comtypes&am…

linux tmux 详细教程,Linux下的神器介绍之Tmux分屏器

前言我们为什么需要分屏器呢?对于这个问题,我想大家肯定都有自己的看法。主流的观点是这样的,对于生活在Linux下的人(开发人员、运维人员、普通爱好者)都不可避免的使用终端模拟器(比如,gnome-terminal)去执行一些命令或者脚本。但…