最近做一個小程序開發任務,主要負責后臺部分開發;根據項目需求,需要實現三個定時任務:
1>定時更新微信token,需要2小時更新一次;
2>商品定時上線;
3>定時檢測后臺服務是否存活;
使用Python去實現這三個任務,這里需要使用定時相關知識點;
Python實現定點與定時任務方式比較多,找到下面四中實現方式,每個方式都有自己應用場景;下面來快速介紹Python中常用的定時任務實現方式:
1>循環+sleep;
2>線程模塊中Timer類;
3>schedule模塊;
4>定時框架:APScheduler
在開始之前先設定一個任務(這樣不用依賴外部環境):
1:定時或者定點監測CPU與內存使用率;
2:將時間,CPU,內存使用情況保存到日志文件;
先來實現系統監測功能:
準備工作:安裝psutil:
pip install psutil
功能實現
代碼運行結果:
2019-03-21 14:23:41 cpu:0.6%, mem:77.2%
接下來我們要實現定時監測,比如3s監測一下系統資源使用情況。
最簡單使用方式:sleep
這種方式最簡單,直接使用while+sleep就可以實現:
輸出結果:
2019-03-21 14:28:42 cpu:1.5%, mem:77.6%
2019-03-21 14:28:45 cpu:1.6%, mem:77.6%
2019-03-21 14:28:48 cpu:1.4%, mem:77.6%
2019-03-21 14:28:51 cpu:1.4%, mem:77.6%
2019-03-21 14:28:54 cpu:1.3%, mem:77.6%
這種方式存在問題:只能處理單個定時任務。
如果你依然在編程的世界里迷茫,不知道自己的未來規劃
自己是一名高級python開發工程師,從基礎的python腳本到web開發、爬蟲、django、數據挖掘等,零基礎到項目實戰的資料都有整理。送給每一位python的小伙伴!分享一些學習的方法和需要注意的小細節
又來了新任務:需要每秒監測網絡收發字節,代碼實現如下:
代碼執行結果:
2019-03-21 14:47:21 bytessent=169752183, bytesrecv=1107900973
如果我們同時在while循環中監測兩個任務會有等待問題,不能每秒監測網絡情況。
Timer實現方式
timer最基本理解就是定時器,我們可以啟動多個定時任務,這些定時器任務是異步執行,所以不存在等待順序執行問題。
先來看Timer的基本使用:
導入:from threading import Timer
主要方法:
Timer方法 | 說明 |
---|---|
Timer(interval, function, args=None, kwargs=None) | 創建定時器 |
cancel() | 取消定時器 |
start() | 使用線程方式執行 |
join(self, timeout=None) | 等待線程執行結束 |
定時器只能執行一次,如果需要重復執行,需要重新添加任務;
我們先來看基本使用:
輸出結果:
2019-03-21 15:13:36.739798
2019-03-21 15:13:37 bytessent=171337324, bytesrecv=1109002349
2019-03-21 15:13:39 cpu:1.4%, mem:93.2%
2019-03-21 15:13:39.745187
可以看到,花費時間為3S,但是我們想要做的是每秒監控網絡狀態;如何處理。
Timer只能執行一次,所以執行完成之后需要再次添加任務,我們對代碼進行修改:
執行結果:
2019-03-21 15:18:21 cpu:1.5%, mem:93.2%
2019-03-21 15:18:21 bytessent=171376522, bytesrecv=1109124678
2019-03-21 15:18:22 bytessent=171382215, bytesrecv=1109128294
2019-03-21 15:18:23 bytessent=171384278, bytesrecv=1109129702
2019-03-21 15:18:24 cpu:1.9%, mem:93.2%
2019-03-21 15:18:24 bytessent=171386341, bytesrecv=1109131110
2019-03-21 15:18:25 bytessent=171388527, bytesrecv=1109132600
2019-03-21 15:18:26 bytessent=171390590, bytesrecv=1109134008
從時間中可以看到,這兩個任務可以同時進行不存在等待問題。
Timer的實質是使用線程方式去執行任務,每次執行完后會銷毀,所以不必擔心資源問題。
調度模塊:schedule
schedule是一個第三方輕量級的任務調度模塊,可以按照秒,分,小時,日期或者自定義事件執行時間;
安裝方式:
pip install schedule
我們來看一個例子:
執行結果:
do func? time : 2019-03-22 08:51:38
do func2 time: 2019-03-22 08:51:39
do func? time : 2019-03-22 08:51:39
do func? time : 2019-03-22 08:51:40
do func2 time: 2019-03-22 08:51:41
do func? time : 2019-03-22 08:51:41
do func? time : 2019-03-22 08:51:42
do func2 time: 2019-03-22 08:51:43
do func? time : 2019-03-22 08:51:43
do func? time : 2019-03-22 08:51:44
do func2 time: 2019-03-22 08:51:45
do func? time : 2019-03-22 08:51:45
do func? time : 2019-03-22 08:51:46
執行過程分析:
>1>因為在jupyter下執行,所以先將schedule任務清空;
>2>按時間間在schedule中隔添加任務;
>3>這里按照秒間隔添加func,按照兩秒間隔添加func2;
>4>schedule添加任務后,需要查詢任務并執行任務;
>5>為了防止占用資源,每秒查詢到點任務,然后順序執行;
第5個順序執行怎么理解,我們修改func函數,里面添加time.sleep(2)
然后只執行func工作,輸出結果:
do func? time : 2019-03-22 09:00:59
do func? time : 2019-03-22 09:01:02
do func? time : 2019-03-22 09:01:05
可以看到時間間隔為3S,為什么不是1S?
因為這個按照順序執行,func休眠2S,循環任務查詢休眠1S,所以會存在這個問題。
在我們使用這種方式執行任務需要注意這種阻塞現象。
我們看下schedule模塊常用使用方法:
這種方式局限性:如果工作任務回非常耗時就會影響其他任務執行。我們可以考慮使用并發機制配置這個模塊使用。
任務框架APScheduler
APScheduler是Python的一個定時任務框架,用于執行周期或者定時任務,
可以基于日期、時間間隔,及類似于Linux上的定時任務crontab類型的定時任務;
該該框架不僅可以添加、刪除定時任務,還可以將任務存儲到數據庫中,實現任務的持久化,使用起來非常方便。
安裝方式:
pip install apscheduler
apscheduler組件及簡單說明:
1>triggers(觸發器):觸發器包含調度邏輯,每一個作業有它自己的觸發器
2>job stores(作業存儲):用來存儲被調度的作業,默認的作業存儲器是簡單地把作業任務保存在內存中,支持存儲到MongoDB,Redis數據庫中
3> executors(執行器):執行器用來執行定時任務,只是將需要執行的任務放在新的線程或者線程池中運行
4>schedulers(調度器):調度器是將其它部分聯系在一起,對使用者提供接口,進行任務添加,設置,刪除。
來看一個簡單例子:
輸出結果:
do func? time : 2019-03-22 10:32:20
do func2 time: 2019-03-22 10:32:21
do func? time : 2019-03-22 10:32:22
do func? time : 2019-03-22 10:32:24
do func2 time: 2019-03-22 10:32:24
do func? time : 2019-03-22 10:32:26
輸出結果中可以看到:任務就算是有延時,也不會影響其他任務執行。
APScheduler框架提供豐富接口去實現定時任務,可以去參考官方文檔去查看使用方式。
最后選擇:
簡單總結上面四種定時定點任務實現:
1:循環+sleep方式適合簡答測試,
2:timer可以實現定時任務,但是對定點任務來說,需要檢查當前時間點;
3:schedule可以定點定時執行,但是需要在循環中檢測任務,而且存在阻塞;
4:APScheduler框架更加強大,可以直接在里面添加定點與定時任務;
綜合考慮,決定使用APScheduler框架,實現簡單,只需要直接創建任務,并將添加到調度器中即可。
總結
以上所述是小編給大家介紹的Python3實現定時任務的四種方式,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
