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.pswp.cn/news/370903.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370903.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370903.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

圖片和文件上傳js剖析

/** * 商戶資質信息模塊js * * 涉及頁面組件 { * 上傳組件(UploadFileComponent) * } * * * 初始化工具(init) * * Author:Waver */var qualificationInfoModule (function() { // 上傳文件類型 var UPLOAD_FILE_TYPE…

研究僵局–第1部分

我敢肯定我們都去過那里:太晚了,您餓了,服務器已掛起,或者應用程序正在以蝸牛的速度運行,并且有人喘著氣想要您解決問題,然后再去解決。 您的應用程序意外掛起的可能原因之一是稱為死鎖的線程問題。 無需贅…

前端的學習之旅

Html學習筆記1 特殊符號&#xff1a;html中對換行縮進空格不敏感&#xff0c;都只會解析成一個空格 空格&#xff1a; < : < > :$gt; 版權符號&#xff1a;&copy&#xff1b; 表格&#xff1a;1 表示表格&#xff1a;table表示表格 tr&#xff1a;…

使用Vue.js和Axios從第三方API獲取數據 — SitePoint

更多的往往不是&#xff0c;建立你的JavaScript應用程序時&#xff0c;你會想把數據從遠程源或消耗一個[ API ]&#xff08;https&#xff1a;/ /恩。維基百科。org /維基/ application_programming_interface&#xff09;。我最近看了一些[公開]&#xff08;https://github.co…

區位碼怎么知道點陣里的起始點_自身免疫疾病的GAPS起始飲食改良版

寫這篇文章的原因如果您已經關注我的博客一段時間&#xff0c;您知道我開始使用GAPS飲食&#xff0c;然后轉換到AIP飲食&#xff0c;因為我仍在努力治療炎癥和自身免疫的發作。 Katy Haldiman 有同樣的經歷&#xff0c;我們并不孤單。許多患有自身免疫性疾病的人在 GAPS 上掙扎…

Linux存儲保護,談談Linux中的存儲保護

談談Linux中的存儲保護以下討論的內容是以i386平臺為基礎的Linux將4G的地址劃分為用戶空間和內核空間兩部分。在Linux內核的低版本中(2。0。X)&#xff0c;通常0-3G為用戶空間&#xff0c;3G-4G為內核空間。這個分界點是可以可以改動的。正是這個分界點的存在&#xff0c;限制了…

004-JQuery屬性

添加與刪除屬性CSS類HTML代碼/文本/值添加與刪除屬性 attr(name|properties|key,value|fn) &#xff1a;設置或返回被選元素的屬性值 removeAttr(name) &#xff1a;從每一個匹配的元素中刪除name屬性 prop(name|properties|key,value|fn) &#xff1a;獲取在匹配的元素集中的第…

預熱您的JVM –超快速生產服務器和IDE

幾個月前&#xff0c;我正在閱讀Java中的復雜事件處理以及實現低延遲的方法。 在我長達一個小時的研究結束時&#xff0c;我發現即使您的應用程序編寫正確并且您的方法主要在0&#xff08;log n&#xff09;的時間內運行&#xff0c;并且您正在使用某些前沿的硬件解決方案&…

微信小程序APP(商超營銷類)經驗總結

項目介紹 這是一款主打門店營銷的小程序。包括首頁、門店、營銷、個人設置、登錄、數據統計展示、營銷設置等。 本來要獨立完成整個項目&#xff0c;包括前后端一套的&#xff0c;有些意外因素&#xff0c;項目臨時收尾&#xff08;說明&#xff1a;只完成了前端的部分&#…

excel不顯示0_Excel數字過長不能完整顯示?超長數字變為0

Excel中計算規則和限制設定數值精確度為15位&#xff01;超過15位后&#xff0c;數字會顯示為0excel數字超過15位&#xff0c;會顯示為0&#xff0c;超過10位&#xff0c;默認采用科學計數法顯示1、如何解決超長數字輸入&#xff0c;全部顯示問題&#xff1f;&#xff08;單元格…

Android天氣預報設計

——嵌入式軟件開發 名字功能模塊代碼行數備注謝燦輝Widget200桌面小程序李楊敏GPS定位&#xff0c;百度地圖API100-150獲取當前所在城市丁小芳城市選擇Activity&#xff0c;天氣API獲取天氣100-200包括數據庫交互本軟件是一個天氣類應用軟件&#xff0c;帶有widget&#xff0c…

linux vi后不保存退出,linux下退出VI的方法:不保存退出

當編輯完文件&#xff0c;準備退出Vi返回到shell時&#xff0c;可以使用以下幾種方法之一。在命令模式中&#xff0c;連按兩次大寫字母Z&#xff0c;若當前編輯的文件曾被修改過&#xff0c;則Vi保存該文件后退出&#xff0c;返回到shell&#xff1b;若當前編輯的文件沒被修改過…

算法筆記_164:算法提高 最小方差生成樹(Java)

目錄 1 問題描述 2 解決方案 1 問題描述 問題描述給定帶權無向圖&#xff0c;求出一顆方差最小的生成樹。輸入格式輸入多組測試數據。第一行為N,M&#xff0c;依次是點數和邊數。接下來M行&#xff0c;每行三個整數U,V,W&#xff0c;代表連接U,V的邊&#xff0c;和權值W。保證圖…

番石榴分配器vs StringUtils

因此&#xff0c;我最近寫了一篇有關舊的&#xff0c;可靠的Apache Commons StringUtils的文章 &#xff0c;該文章引起了一些評論&#xff0c;其中之一是Google Guava提供了更好的連接和拆分字符串的機制。 我必須承認&#xff0c;這是我尚未探索的番石榴的一個角落。 因此&am…

layui數據表格(一:基礎篇,數據展示、分頁組件、表格內嵌表單和圖片)

表格展示神器之一&#xff1a;layui表格 前言&#xff1a;在寫后臺管理系統中使用最多的就是表格數據展示了&#xff0c;使用表格組件能提高大量的開發效率&#xff0c;目前主流的數據表格組件有bootstrap table、layui table、easyUI table等.... 博主個人比較傾向于layui&am…

算法設計與分析_算法設計與分析(第2版)第2章分治策略回顧

YI時間&#xff5c;外刊&#xff5c;MM-DFW&#xff5c;機器學習系列點擊上方藍字&#xff0c;關注給你寫干貨的松子茶分治策略是通用算法設計技術之一&#xff0c;很多有效的算法是它的特殊實現,顧名思義就是分而治之。一個問題能夠用分治法求解的要素是問題能夠按照某種方式分…

2017-2018-1 Java演繹法 第三周 作業

團隊任務&#xff1a;團隊展示與選題團隊展示 隊員學號及姓名 學號  姓名  主要負責工作  20162315  馬軍  日常統計&#xff0c;項目部分代碼  20162316  劉誠昊  項目部分代碼&#xff0c;代碼質量測試  20162317  袁逸灝  組長 項目 主要 代碼  201…

linux開機啟動roscore,樹莓派ubuntuMate系統中開機自啟動ROS的launch文件

0x00 為何需要開機自啟動launch文件在ROS開發后期階段由于功能已經趨于穩定&#xff0c;因此就需要系統在一上電啟動后就自動把ROS下的各節點程序加載運行&#xff0c;這樣就省去了我們還得手動輸入roslaunch命令來加載bringup的launch文件的操作。經過我的實際測試目前有兩種方…

Oracle ADF移動世界! 你好!

您好&#xff0c;ADF Mobile&#xff0c;世界&#xff01; 您可能已經知道... ADF Mobile在這里&#xff01; 以下是一些鏈接&#xff0c;這些鏈接會讓您有賓至如歸的感覺。 ADF Mobile主頁&#xff1a; http://www.oracle.com/technetwork/developer-tools/adf/overview/ad…

Bootstrap里的文件分別代表什么意思及其引用方法

關于Bootstrap打包的文件分別代表什么意思&#xff0c;官網也沒有給出一個明確的解釋&#xff0c;在網上查了一些資料&#xff0c;總價歸納了如下&#xff1a; bootstrap/ <!--主目錄--> ├── css/ <!--CSS樣式文件--> │ ├── bootstrap.css <!…