Python 定時任務

2021-09-28 07:02:07 字數 3733 閱讀 2347

在專案中,我們可能遇到有定時任務的需求。其一:定時執行任務。例如每天早上 8 點定時推送早報。其二:每隔乙個時間段就執行任務。比如:每隔乙個小時提醒自己起來走動走動,避免長時間坐著。今天,我跟大家分享下 python 定時任務的實現方法。

請參考: python定時任務(上)

python定時任務(下)

第一種辦法是最簡單又最暴力。那就是在乙個死迴圈中,使用執行緒睡眠函式 sleep()。
from datetime import datetime

import time

'''每個 10 秒列印當前時間。

'''def

timedtask()

:while

true

:print

(datetime.now(

).strftime(

"%y-%m-%d %h:%m:%s"))

time.sleep(10)

if __name__ ==

'__main__'

: timedtask(

)

既然第一種方法暴力,那麼有沒有比較優雅地方法?答案是肯定的。python 標準庫 threading 中有個 timer 類。它會新啟動乙個執行緒來執行定時任務,所以它是非阻塞函式。
from datetime import datetime

from threading import timer

import time

'''每個 10 秒列印當前時間。

'''def

timedtask()

:'''

第乙個引數: 延遲多長時間執行任務(單位: 秒)

第二個引數: 要執行的任務, 即函式

第三個引數: 呼叫函式的引數(tuple)

'''timer(

10, task,()

).start(

)# 定時任務

deftask()

:print

(datetime.now(

).strftime(

"%y-%m-%d %h:%m:%s"))

if __name__ ==

'__main__'

: timedtask(

)while

true

:print

(time.time())

time.sleep(

5)

執行結果:

1512486945.1196375

1512486950.119873

2017-12

-0523:

15:501512486955.133385

第三種方式是使用標準庫中sched模組。sched 是事件排程器,它通過 scheduler 類來排程事件,從而達到定時執行任務的效果。

sched庫使用起來也是非常簡單。

1)首先構造乙個sched.scheduler類

它接受兩個引數:timefunc 和 delayfunc。timefunc 應該返回乙個數字,代表當前時間,delayfunc 函式接受乙個引數,用於暫停執行的時間單元。

一般使用預設引數就行,即傳入這兩個引數 time.time 和 time.sleep.當然,你也可以自己實現時間暫停的函式。

2)新增排程任務

scheduler 提供了兩個新增排程任務的函式:

enter(delay, priority, action, argument=(), kwargs={})

該函式可以延遲一定時間執行任務。delay 表示延遲多長時間執行任務,單位是秒。priority為優先順序,越小優先順序越大。兩個任務指定相同的延遲時間,優先順序大的任務會向被執行。action 即需要執行的函式,argument 和 kwargs 分別是函式的位置和關鍵字引數。

scheduler.enterabs(time, priority, action, argument=(), kwargs={})

新增一項任務,但這個任務會在 time 這時刻執行。因此,time 是絕對時間.其他引數用法與 enter() 中的引數用法是一致。

3)把任務執行起來

呼叫 scheduler.run()函式就完事了。

下面是 sche 使用的簡單示例:

from datetime import datetime

import sched

import time

'''每個 10 秒列印當前時間。

'''def

timedtask()

:# 初始化 sched 模組的 scheduler 類

scheduler = sched.scheduler(time.time, time.sleep)

# 增加排程任務

scheduler.enter(10,

1, task)

# 執行任務

scheduler.run(

)# 定時任務

deftask()

:print

(datetime.now(

).strftime(

"%y-%m-%d %h:%m:%s"))

if __name__ ==

'__main__'

: timedtask(

)

apscheduler的全稱是advanced python scheduler。它是乙個輕量級的 python 定時任務排程框架。apscheduler 支援三種排程任務:固定時間間隔,固定時間點(日期),linux 下的 crontab 命令。同時,它還支援非同步執行、後台執行排程任務。

apscheduler 使用起來還算是比較簡單。執行乙個排程任務只需要以下三部曲。

新建乙個 schedulers (排程器) 。

新增乙個排程任務(job stores)。

執行排程任務。

下面是執行每 2 秒報時的簡單示例**:

import datetime

import time

from apscheduler.schedulers.background import backgroundscheduler

deftimedtask()

:print

(datetime.datetime.utcnow(

).strftime(

"%y-%m-%d %h:%m:%s.%f")[

:-3]

)if __name__ ==

'__main__'

:# 建立後台執行的 schedulers

scheduler = backgroundscheduler(

)# 新增排程任務

# 排程方法為 timedtask,觸發器選擇 interval(間隔性),間隔時長為 2 秒

scheduler.add_job(timedtask,

'interval'

, seconds=2)

# 啟動排程任務

scheduler.start(

)while

true

:print

(time.time())

time.sleep(

5)

python定時任務

說明 使用python內建的模組來實現,本篇部落格只是以迴圈定時來示範,其他的可以結合crontab的風格自己設定 一 導包 from apscheduler.schedulers.blocking import blockingscheduler二 普通函式的使用 1 interval模式,功能比...

python定時任務

原文 import schedule 2 import time 3 4 def test 5 print i m working.6 def test2 7 print i m working.in job2 8 9 每10分鐘執行一次job函式 10 schedule.every 10 minu...

Python 定時任務

1 需求規定 每天16點的每分鐘的第20s定時執行乙個.py檔案,執行完時再休息3s。2 實現 1 schedule.py import datetime,os,time coding utf 8 def job interval,command while true now datetime.da...