python- 進階 與flask的搭配使用---定時任務框架APScheduler學習詳解

APScheduler簡介

在平常的工作中幾乎有一半的功能模塊都需要定時任務來推動,例如項目中有一個定時統計程序,定時爬出網站的URL程序,定時檢測釣魚網站的程序等等,都涉及到了關于定時任務的問題,第一時間想到的是利用time模塊的time.sleep()方法使程序休眠來達到定時任務的目的,雖然這樣也可以,但是總覺得不是那么的專業,^_^所以就找到了python的定時任務模塊APScheduler:

APScheduler基于Quartz的一個Python定時任務框架,實現了Quartz的所有功能,使用起來十分方便。提供了基于日期、固定時間間隔以crontab類型的任務,并且可以持久化任務。基于這些功能,我們可以很方便的實現一個python定時任務系統

安裝

1、利用pip進行安裝

1

$ pip install apscheduler

2、源碼安裝(https://pypi.python.org/pypi/APScheduler/)

1

$ python setup.py install

APScheduler有四種組成部分:

觸發器(trigger)包含調度邏輯,每一個作業有它自己的觸發器,用于決定接下來哪一個作業會運行。除了他們自己初始配置意外,觸發器完全是無狀態的。

作業存儲(job store)存儲被調度的作業,默認的作業存儲是簡單地把作業保存在內存中,其他的作業存儲是將作業保存在數據庫中。一個作業的數據講在保存在持久化作業存儲時被序列化,并在加載時被反序列化。調度器不能分享同一個作業存儲。

執行器(executor)處理作業的運行,他們通常通過在作業中提交制定的可調用對象到一個線程或者進城池來進行。當作業完成時,執行器將會通知調度器。

調度器(scheduler)是其他的組成部分。你通常在應用只有一個調度器,應用的開發者通常不會直接處理作業存儲、調度器和觸發器,相反,調度器提供了處理這些的合適的接口。配置作業存儲和執行器可以在調度器中完成,例如添加、修改和移除作業。 

簡單應用:

1

2

3

4

5

6

7

8

9

import?time

from?apscheduler.schedulers.blocking?import?BlockingScheduler

?

def?my_job():

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

?

sched?=?BlockingScheduler()

sched.add_job(my_job,?'interval', seconds=5)

sched.start()

上面的例子表示每隔5s執行一次my_job函數,輸出當前時間信息

操作作業

1. 添加作業

上面是通過add_job()來添加作業,另外還有一種方式是通過scheduled_job()修飾器來修飾函數

1

2

3

4

5

6

7

8

9

10

import?time

from?apscheduler.schedulers.blocking?import?BlockingScheduler

?

sched?=?BlockingScheduler()

?

@sched.scheduled_job('interval', seconds=5)

def?my_job():

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

?

sched.start()

2. 移除作業

1

2

3

4

5

job?=?scheduler.add_job(myfunc,?'interval', minutes=2)

job.remove()

#如果有多個任務序列的話可以給每個任務設置ID號,可以根據ID號選擇清除對象,且remove放到start前才有效

sched.add_job(myfunc,?'interval', minutes=2,?id='my_job_id')

sched.remove_job('my_job_id')

3. 暫停和恢復作業

?暫停作業:

1

2

apsched.job.Job.pause()

apsched.schedulers.base.BaseScheduler.pause_job()

?恢復作業:

1

2

apsched.job.Job.resume()

apsched.schedulers.base.BaseScheduler.resume_job()

4. 獲得job列表

?獲得調度作業的列表,可以使用get_jobs()來完成,它會返回所有的job實例。或者使用print_jobs()來輸出所有格式化的作業列表。也可以利用get_job(任務ID)獲取指定任務的作業列表

1

2

3

job?=?sched.add_job(my_job,?'interval', seconds=2?,id='123')

print?sched.get_job(job_id='123')

print?sched.get_jobs()

5. 關閉調度器

?默認情況下調度器會等待所有正在運行的作業完成后,關閉所有的調度器和作業存儲。如果你不想等待,可以將wait選項設置為False。

1

2

sched.shutdown()

sched.shutdown(wait=False)

?作業運行的控制(trigger)

add_job的第二個參數是trigger,它管理著作業的調度方式。它可以為date, interval或者cron。對于不同的trigger,對應的參數也相同。

(1). cron定時調度(某一定時時刻執行)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

(int|str) 表示參數既可以是int類型,也可以是str類型

(datetime |?str) 表示參數既可以是datetime類型,也可以是str類型

?

year (int|str) –?4-digit year?-(表示四位數的年份,如2008年)

month (int|str) – month (1-12)?-(表示取值范圍為1-12月)

day (int|str) – day of the (1-31)?-(表示取值范圍為1-31日)

week (int|str) – ISO week (1-53)?-(格里歷20061231日可以寫成2006-W52-7(擴展形式)或2006W527(緊湊形式))

day_of_week (int|str) – number?or?name of weekday (0-6?or?mon,tue,wed,thu,fri,sat,sun)?-?(表示一周中的第幾天,既可以用0-6表示也可以用其英語縮寫表示)

hour (int|str) – hour (0-23)?-?(表示取值范圍為0-23時)

minute (int|str) – minute (0-59)?-?(表示取值范圍為0-59分)

second (int|str) – second (0-59)?-?(表示取值范圍為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)?-(表示時區取值)

參數的取值格式:

例子:

1

2

3

4

5

6

7

8

9

10

11

#表示2017年3月22日17時19分07秒執行該程序

sched.add_job(my_job,?'cron', year=2017,month?=?03,day?=?22,hour?=?17,minute?=?19,second?=?07)

?

#表示任務在6,7,8,11,12月份的第三個星期五的00:00,01:00,02:00,03:00 執行該程序

sched.add_job(my_job,?'cron', month='6-8,11-12', day='3rd fri', hour='0-3')

?

#表示從星期一到星期五5:30(AM)直到2014-05-30 00:00:00

sched.add_job(my_job(),?'cron', day_of_week='mon-fri', hour=5, minute=30,end_date='2014-05-30')

?

#表示每5秒執行該程序一次,相當于interval 間隔調度中seconds = 5

sched.add_job(my_job,?'cron',second?=?'*/5')

(2). interval 間隔調度(每隔多久執行)

1

2

3

4

5

6

7

8

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

例子:

1

2

#表示每隔3天17時19分07秒執行一次任務

sched.add_job(my_job,?'interval',days??=?03,hours?=?17,minutes?=?19,seconds?=?07)

(3). date 定時調度(作業只會執行一次)

1

2

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

例子:

1

2

3

4

# 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'])

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/273950.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/273950.shtml
英文地址,請注明出處:http://en.pswp.cn/news/273950.shtml

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

相關文章

Mingw下g++編譯執行順序錯誤

今天寫一個簡單的線性表時,用Mingw中的g編譯、調試、運行時發現一個奇怪的現象:程序的執行順序與實際編寫順序不一致。 編譯環境:代碼編寫 win7下 editplus Mingw 4.3.3 g 代碼片段如下: 1 //function: create a list 2 //ti…

python系統學習1-程序設計的基本方法

一、程序設計基本方法 計算機與程序設計 編譯和解釋 程序的基本編寫方法 計算機編程 1、計算機與程序設計 (1)、計算機是根據指令操作數據的設備 功能性:對數據的操作、表現為數據計算、輸出輸入處理和結果存儲。 可編程性:…

python 系統學習實例1.1 - 華氏度與攝氏度的轉換

# C ( F - 32 ) / 1.8???????????????????????????????????????????????????????????????????????????????? # F C * 1.8 32?????????????????????????????…

EMS問題

如果EMS啟動后在運行時報出 JMS error: "Not allowed to create destination這個錯誤,可能就是你啟動方式的問題了進入到EMS的安裝目錄的bin目錄下,運行tibemsca.bat那個文件就好使了。轉載于:https://www.cnblogs.com/xiaotianyu/p/3421737.html

python 系統學習實例1.2 - 人民幣與美元的轉換

# RMB USD / 6.78???????????????????????????????????????????????????????????????????????????????? # USD RMB* 6.78 def tempConvert(): t input("請輸入數值:") …

HDTV(1920x1080)碼率和視頻質量關系的研究 2 (實驗結果)

上一篇文章中介紹了實驗的準備工作, HDTV(1920x1080)碼率和視頻質量關系的研究 1 (前期準備) 本文介紹一下實驗的結果。 首先來看一下主觀評價的試驗結果: 從實驗結果來看,可以得出以下結論&…

python爬蟲--如何爬取翻頁url不變的網站

參考 https://blog.csdn.net/c350577169/article/details/80410133

POJ 1745 Divisibility DP

POJ:http://poj.org/problem?id1745 A完這題去買福鼎肉片,和舍友去買滴~舍友感慨“這一天可以賣好幾百份,每份就算賺一塊錢。。那么一個月。。一年。。。” 我說“那我們以后去賣這個吧,餓了還能自己煮著吃” 哈哈,一群天真的少…

NGUI如何創建自己的精靈圖集

說實話其實很簡單,但是在不知道的情況下真的不好弄啊. 1. 選擇你要制作精靈圖集的圖片,可以選擇多張 2. 提倡使用快捷鍵Alt Shift M 會有如下窗口彈出,也可以NGUI --> Open-->Atlas Maker打開 我們看到在Sprites里面就是我們選擇的要制作圖集的圖片 當在Replace后面的輸…

C++ - 進階 1002

This time, you are supposed to find AB where A and B are two polynomials. Input Specification: Each input file contains one test case. Each case occupies 2 lines, and each line contains the information of a polynomial: K N?1?? a?N?1???? N?2??…

修改6S Fortran77 代碼,建立查找表

逐像元大氣校正,常預先計算查找表(LUT,LookUp Tabel),6S大氣輻射傳輸模式也可以用來計算LUT。但6S源程序輸出信息多,且浮點數輸出精度低,不利于提取關鍵信息生成LUT,本文描述了怎樣修…

c++ 實例

#include "stdafx.h" #include <iostream> using namespace std; int main() { int a; a 4; cout<<a<<endl; return 0; }

VMware虛擬機與宿主無法復制的解決辦法

由于工作需要&#xff0c;上網機器使用虛擬機&#xff0c;因此需要經常來回的拷貝文件&#xff0c;而vmware從6.5一直走來到10.0.1&#xff0c;總是有一個問題很讓人苦惱---共享粘貼板總是會無故失效。經常實驗&#xff0c;發現可以經過以下方法臨時解決一下&#xff0c;雖然不…

c++ pat 乙級 --1001?害死人不償命的(3n+1)猜想

1001 害死人不償命的(3n1)猜想 &#xff08;15 分&#xff09; 卡拉茲(Callatz)猜想&#xff1a; 對任何一個正整數 n&#xff0c;如果它是偶數&#xff0c;那么把它砍掉一半&#xff1b;如果它是奇數&#xff0c;那么把 (3n1) 砍掉一半。這樣一直反復砍下去&#xff0c;最后…

【開源項目之路】jquery的build問題

在剛開始clone了jquery到本地build的時候&#xff0c;就遇到了問題。 “ENORESTARGET No tag found that was able to satisfy ...” 提示為bower install失敗&#xff0c;反復查找原因&#xff0c;最后在這兒看到同樣類似的問題&#xff0c;貌似是git協議的連接問題&#xff0…

適配ios7

if ([self respondsToSelector:selector(edgesForExtendedLayout)]){self.edgesForExtendedLayout UIRectEdgeNone;self.extendedLayoutIncludesOpaqueBars NO;self.modalPresentationCapturesStatusBarAppearance NO;} 轉載于:https://www.cnblogs.com/jiackyan/p/3441378.…

c++ pat 乙級 -------1002 讀入一個正整數 n,計算其各位數字之和,用漢語拼音寫出和的每一位數字。

1002 寫出這個數 &#xff08;20 分&#xff09; 讀入一個正整數 n&#xff0c;計算其各位數字之和&#xff0c;用漢語拼音寫出和的每一位數字。 輸入格式&#xff1a; 每個測試輸入包含 1 個測試用例&#xff0c;即給出自然數 n 的值。這里保證 n 小于 10?100??。 輸出…

USACO SEC.1.3 No.1 Mixing Milk

題意&#xff1a;需要收購總數為N的牛奶&#xff0c;現在有M個牛奶供應商&#xff08;總量足夠&#xff09;&#xff0c;給出總數和單價&#xff0c;求最小的花銷。 核心&#xff1a;基本的貪心解法&#xff0c;按單價排序逐個選取。 目的在于熟悉基本的貪心法的基本方法和思路…

c++ 獲取數組的長度

//獲得數組的長度 template<typename T> int count(T& x) { int s1 sizeof(x); int s2 sizeof(x[0]); int result s1 / s2; return result; }

[WPF疑難] 繼承自定義窗口

[WPF疑難] 繼承自定義窗口 原文 [WPF疑難] 繼承自定義窗口 [WPF疑難] 繼承自定義窗口 周銀輝 項目中有不少的彈出窗口&#xff0c;按照美工的設計其外邊框&#xff08;包括最大化&#xff0c;最小化&#xff0c;關閉等按鈕&#xff09;自然不同于Window自身的&#xff0c;但每個…