一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Python3實現定時任務的四種方式

Python3實現定時任務的四種方式

2021-07-01 00:36IT派森 Python

Python實現定點與定時任務方式比較多,找到下面四中實現方式,每個方式都有自己應用場景;下面來快速介紹Python中常用的定時任務實現方式,一起看看吧

最近做一個小程序開發任務,主要負責后臺部分開發;根據項目需求,需要實現三個定時任務

1>定時更新微信token,需要2小時更新一次;

2>商品定時上線;

3>定時檢測后臺服務是否存活;

使用python去實現這三個任務,這里需要使用定時相關知識點;

python實現定點與定時任務方式比較多,找到下面四中實現方式,每個方式都有自己應用場景;下面來快速介紹python中常用的定時任務實現方式:

1>循環+sleep;

2>線程模塊中timer類;

3>schedule模塊;

4>定時框架:apscheduler

在開始之前先設定一個任務(這樣不用依賴外部環境):

1:定時或者定點監測cpu與內存使用率;

2:將時間,cpu,內存使用情況保存到日志文件;

先來實現系統監測功能:

準備工作:安裝psutil:pip install psutil

功能實現

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#psutil:獲取系統信息模塊,可以獲取cpu,內存,磁盤等的使用情況
import psutil
import time
import datetime
#logfile:監測信息寫入文件
def monitorsystem(logfile = none):
 #獲取cpu使用情況
 cpuper = psutil.cpu_percent()
 #獲取內存使用情況:系統內存大小,使用內存,有效內存,內存使用率
 mem = psutil.virtual_memory()
 #內存使用率
 memper = mem.percent
 #獲取當前時間
 now = datetime.datetime.now()
 ts = now.strftime('%y-%m-%d %h:%m:%s')
 line = f'{ts} cpu:{cpuper}%, mem:{memper}%'
 print(line)
 if logfile:
  logfile.write(line)

代碼運行結果:

2019-03-21 14:23:41 cpu:0.6%, mem:77.2%

接下來我們要實現定時監測,比如3s監測一下系統資源使用情況。

最簡單使用方式:sleep

這種方式最簡單,直接使用while+sleep就可以實現:

?
1
2
3
4
5
6
def loopmonitor():
 while true:
  monitorsystem()
  #2s檢查一次
  time.sleep(3)
loopmonitor()

輸出結果:

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的小伙伴!分享一些學習的方法和需要注意的小細節

又來了新任務:需要每秒監測網絡收發字節,代碼實現如下:

?
1
2
3
4
5
6
7
8
9
10
11
def monitornetwork(logfile = none):
 #獲取網絡收信息
 netinfo = psutil.net_io_counters()
 #獲取當前時間
 now = datetime.datetime.now()
 ts = now.strftime('%y-%m-%d %h:%m:%s')
 line = f'{ts} bytessent={netinfo.bytes_sent}, bytesrecv={netinfo.bytes_recv}'
 print(line)
 if logfile:
  logfile.write(line)
monitornetwork()

代碼執行結果:

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) 等待線程執行結束

 

定時器只能執行一次,如果需要重復執行,需要重新添加任務;

我們先來看基本使用:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from threading import timer
#記錄當前時間
print(datetime.datetime.now())
#3s執行一次
stimer = timer(3, monitorsystem)
#1s執行一次
ntimer = timer(1, monitornetwork)
#使用線程方式執行
stimer.start()
ntimer.start()
#等待結束
stimer.join()
ntimer.join()
#記錄結束時間
print(datetime.datetime.now())

輸出結果:

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只能執行一次,所以執行完成之后需要再次添加任務,我們對代碼進行修改:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from threading import timer
import psutil
import time
import datetime
def monitorsystem(logfile = none):
 cpuper = psutil.cpu_percent()
 mem = psutil.virtual_memory()
 memper = mem.percent
 now = datetime.datetime.now()
 ts = now.strftime('%y-%m-%d %h:%m:%s')
 line = f'{ts} cpu:{cpuper}%, mem:{memper}%'
 print(line)
 if logfile:
  logfile.write(line)
 #啟動定時器任務,每三秒執行一次
 timer(3, monitorsystem).start()
def monitornetwork(logfile = none):
 netinfo = psutil.net_io_counters()
 now = datetime.datetime.now()
 ts = now.strftime('%y-%m-%d %h:%m:%s')
 line = f'{ts} bytessent={netinfo.bytes_sent}, bytesrecv={netinfo.bytes_recv}'
 print(line)
 if logfile:
  logfile.write(line)
 #啟動定時器任務,每秒執行一次
 timer(1, monitornetwork).start()
monitorsystem()
monitornetwork()

執行結果:

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

我們來看一個例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import datetime
import schedule
import time
def func():
 now = datetime.datetime.now()
 ts = now.strftime('%y-%m-%d %h:%m:%s')
 print('do func time :',ts)
def func2():
 now = datetime.datetime.now()
 ts = now.strftime('%y-%m-%d %h:%m:%s')
 print('do func2 time:',ts)
def tasklist():
 #清空任務
 schedule.clear()
 #創建一個按秒間隔執行任務
 schedule.every(1).seconds.do(func)
 #創建一個按2秒間隔執行任務
 schedule.every(2).seconds.do(func2)
 #執行10s
 for i in range(10):
  schedule.run_pending()
  time.sleep(1)
tasklist()

執行結果:

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模塊常用使用方法:

?
1
2
3
4
5
6
7
8
9
10
11
12
#schedule.every(1)創建job, seconds.do(func)按秒間隔查詢并執行
schedule.every(1).seconds.do(func)
#添加任務按分執行
schedule.every(1).minutes.do(func)
#添加任務按天執行
schedule.every(1).days.do(func)
#添加任務按周執行
schedule.every().weeks.do(func)
#添加任務每周1執行,執行時間為下周一這一時刻時間
schedule.every().monday.do(func)
#每周1,1點15開始執行
schedule.every().monday.at("12:00").do(job)

這種方式局限性:如果工作任務回非常耗時就會影響其他任務執行。我們可以考慮使用并發機制配置這個模塊使用。

任務框架apscheduler

apscheduler是python的一個定時任務框架,用于執行周期或者定時任務,

可以基于日期、時間間隔,及類似于linux上的定時任務crontab類型的定時任務;

該該框架不僅可以添加、刪除定時任務,還可以將任務存儲到數據庫中,實現任務的持久化,使用起來非常方便。

安裝方式:pip install apscheduler

apscheduler組件及簡單說明:

1>triggers(觸發器):觸發器包含調度邏輯,每一個作業有它自己的觸發器

2>job stores(作業存儲):用來存儲被調度的作業,默認的作業存儲器是簡單地把作業任務保存在內存中,支持存儲到mongodb,redis數據庫中

3> executors(執行器):執行器用來執行定時任務,只是將需要執行的任務放在新的線程或者線程池中運行

4>schedulers(調度器):調度器是將其它部分聯系在一起,對使用者提供接口,進行任務添加,設置,刪除。

來看一個簡單例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import time
from apscheduler.schedulers.blocking import blockingscheduler
def func():
 now = datetime.datetime.now()
 ts = now.strftime('%y-%m-%d %h:%m:%s')
 print('do func time :',ts)
def func2():
 #耗時2s
 now = datetime.datetime.now()
 ts = now.strftime('%y-%m-%d %h:%m:%s')
 print('do func2 time:',ts)
 time.sleep(2)
def dojob():
 #創建調度器:blockingscheduler
 scheduler = blockingscheduler()
 #添加任務,時間間隔2s
 scheduler.add_job(func, 'interval', seconds=2, id='test_job1')
 #添加任務,時間間隔5s
 scheduler.add_job(func2, 'interval', seconds=3, id='test_job2')
 scheduler.start()
dojob()

輸出結果:

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實現定時任務的四種方式,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!

如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

原文鏈接:https://www.jianshu.com/p/1425977657eb

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 午夜国产在线观看 | 99精品国产美女福到在线不卡 | 女班长的放荡日记高h | 毛片一区二区三区提莫影院 | 动漫美女被吸乳 | 摸咪网在线影院在线观看 | 色男人的天堂久久综合 | 久青草国产在线观看视频 | 精品国产区一区二区三区在线观看 | 私人影院免费 | 欧美高清片| 黑人又大又硬又粗再深一点 | zol中关村在线官网 yy6080欧美三级理论 | 四虎成人国产精品视频 | 免费观看视频网站 | 国产乱人乱精一区二区视频密 | 亚飞与亚基国语1080p在线观看 | 欧美精品一区二区三区免费播放 | 成人影院视频 | 99视频精品全部免费观看 | 免费在线看片网站 | 五月色综合婷婷综合俺来也 | 麻豆婷婷 | 亚洲 欧美 中文 日韩 视频 | 国产成人综合亚洲一区 | 久久精品无码人妻无码AV蜜臀 | 小柔的性放荡羞辱日记 | 国产一区日韩二区欧美三 | 国产成人免费片在线观看 | 韩国三级在线观看 完整版 韩国三级视频网站 | 青青99| 久久99国产精品二区不卡 | 日韩在线观看免费 | 国产91素人搭讪系列天堂 | 嫩草影院精品视频在线观看 | 国产成人愉拍免费视频 | 国产欧美二区三区 | 亚洲国产婷婷俺也色综合 | 91啦在线视频 | 娇妻被又大又粗又长又硬好爽 | 久久永久免费视频 |