linux python定时任务调度,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的情况

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

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()

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

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

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

而add_job()是使用最多的,它可以返回一个apscheduler.job.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=(1,), id='test_job1')

#定时任务示例

scheduler.add_job(job1, 'cron', second='*/5', args=(1,2,3,), id='test_job2')

#一次性任务示例

scheduler.add_job(job1, next_run_time=(datetime.datetime.now() + datetime.timedelta(seconds=10)), args=(1,), 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_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'

)

0b1331709591d260c1c78e86d0c51c18.png

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

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

相关文章

研究僵局–第1部分

我敢肯定我们都去过那里:太晚了,您饿了,服务器已挂起,或者应用程序正在以蜗牛的速度运行,并且有人喘着气想要您解决问题,然后再去解决。 您的应用程序意外挂起的可能原因之一是称为死锁的线程问题。 无需赘…

使用Vue.js和Axios从第三方API获取数据 — SitePoint

更多的往往不是,建立你的JavaScript应用程序时,你会想把数据从远程源或消耗一个[ API ](https:/ /恩。维基百科。org /维基/ application_programming_interface)。我最近看了一些[公开](https://github.co…

区位码怎么知道点阵里的起始点_自身免疫疾病的GAPS起始饮食改良版

写这篇文章的原因如果您已经关注我的博客一段时间,您知道我开始使用GAPS饮食,然后转换到AIP饮食,因为我仍在努力治疗炎症和自身免疫的发作。 Katy Haldiman 有同样的经历,我们并不孤单。许多患有自身免疫性疾病的人在 GAPS 上挣扎…

微信小程序APP(商超营销类)经验总结

项目介绍 这是一款主打门店营销的小程序。包括首页、门店、营销、个人设置、登录、数据统计展示、营销设置等。 本来要独立完成整个项目,包括前后端一套的,有些意外因素,项目临时收尾(说明:只完成了前端的部分&#…

excel不显示0_Excel数字过长不能完整显示?超长数字变为0

Excel中计算规则和限制设定数值精确度为15位!超过15位后,数字会显示为0excel数字超过15位,会显示为0,超过10位,默认采用科学计数法显示1、如何解决超长数字输入,全部显示问题?(单元格…

Android天气预报设计

——嵌入式软件开发 名字功能模块代码行数备注谢灿辉Widget200桌面小程序李杨敏GPS定位,百度地图API100-150获取当前所在城市丁小芳城市选择Activity,天气API获取天气100-200包括数据库交互本软件是一个天气类应用软件,带有widget&#xff0c…

算法笔记_164:算法提高 最小方差生成树(Java)

目录 1 问题描述 2 解决方案 1 问题描述 问题描述给定带权无向图,求出一颗方差最小的生成树。输入格式输入多组测试数据。第一行为N,M,依次是点数和边数。接下来M行,每行三个整数U,V,W,代表连接U,V的边,和权值W。保证图…

layui数据表格(一:基础篇,数据展示、分页组件、表格内嵌表单和图片)

表格展示神器之一:layui表格 前言:在写后台管理系统中使用最多的就是表格数据展示了,使用表格组件能提高大量的开发效率,目前主流的数据表格组件有bootstrap table、layui table、easyUI table等.... 博主个人比较倾向于layui&am…

算法设计与分析_算法设计与分析(第2版)第2章分治策略回顾

YI时间|外刊|MM-DFW|机器学习系列点击上方蓝字,关注给你写干货的松子茶分治策略是通用算法设计技术之一,很多有效的算法是它的特殊实现,顾名思义就是分而治之。一个问题能够用分治法求解的要素是问题能够按照某种方式分…

2017-2018-1 Java演绎法 第三周 作业

团队任务:团队展示与选题团队展示 队员学号及姓名 学号  姓名  主要负责工作  20162315  马军  日常统计,项目部分代码  20162316  刘诚昊  项目部分代码,代码质量测试  20162317  袁逸灏  组长 项目 主要 代码  201…

linux开机启动roscore,树莓派ubuntuMate系统中开机自启动ROS的launch文件

0x00 为何需要开机自启动launch文件在ROS开发后期阶段由于功能已经趋于稳定,因此就需要系统在一上电启动后就自动把ROS下的各节点程序加载运行,这样就省去了我们还得手动输入roslaunch命令来加载bringup的launch文件的操作。经过我的实际测试目前有两种方…

Oracle ADF移动世界! 你好!

您好,ADF Mobile,世界! 您可能已经知道... ADF Mobile在这里! 以下是一些链接,这些链接会让您有宾至如归的感觉。 ADF Mobile主页: http://www.oracle.com/technetwork/developer-tools/adf/overview/ad…

css 小知识点:inline/inline-block/line-height

inline: 此元素会被显示为内联元素,元素前后没有换行符。因此:无法设置宽度和高度~ inline-block: 行内块元素。元素前后没有换行符(CSS2.1 新增的值) 用通俗的话讲,就是不独占一行的块级元素。然后拥有…

协同过滤算法_机器学习 | 简介推荐场景中的协同过滤算法,以及SVD的使用

本文始发于个人公众号:TechFlow,原创不易,求个关注今天是机器学习专题的第29篇文章,我们来聊聊SVD在上古时期的推荐场景当中的应用。推荐的背后逻辑有没有思考过一个问题,当我们在淘宝或者是某东这类电商网站购物的时候…

JavaOne 2012:观察与印象

当我坐在旧金山国际机场等待登上飞机返回家中时,我一次又一次令人满意但累人的JavaOne(2012)体验,我正在开始写这篇特别的博客文章。 自上周日的主题演讲以来,在会议上疯狂地撰写了约30篇博客文章之后,很难…

用imspost制作catia后处理_新产品开发需要做原型验证,怎么样成型制作才省钱?...

有一天一个朋友拿着一个公仔机器人的项目过来找我,说做200套外壳,问我如何省成本用最少的钱做好产品。类似一下图片的机器人一样。组装起来高200mm左右,内外配件总共是62个。我当时看到产品小估算重量也很轻,就跟他说用3D打印有快…

如何把大段文字转为带html标签的文字

开发网页的时候,有时候会遇到大段的隐私声明,用户协议等等,我们呀要复制粘贴展示出来,必须加大量的p标签,h1,h2,空格符,br标签,这对我们来说无疑是泪崩的,有个很好的办法…

使用MongoDB进行事件流

MongoDB是一个非常出色的“ NoSQL”数据库,具有广泛的应用程序。 在SoftwareMill开发的一个项目中,我们将其用作复制的事件存储,然后将事件从事件流传输到其他组件。 介绍 基本思想非常简单(另请参阅Martin Fowler关于Event Sou…

c语言实训作业总结,c语言程序设计上机实践心得报告

c语言程序设计上机实践心得报告 班级:11 电信 2 姓名:莫金波 学号:1107032242012.12.28 惠州学院 HUIZHOU UNIVERSITY 我们专业的学生在专业老师的带领下进行了 c 语言设计基础教程的 实践学习。在这之前,我们已经对 c 语言这门课程学习了差不多一 个学期&#xff0…

JavaOne 2012:在JVM上诊断应用程序

值得参加Staffan Larsen (Oracle Java Serviceability Architect)的演讲“ 在JVM上诊断应用程序 ”(Hilton Plaza A / B),只是为了学习Oracle JVM 7随附的新jcmd命令行工具。该演示对我来说是“奖金”,这对…