在專案中,我們可能遇到有定時任務的需求。其一:定時執行任務。例如每天早上 8 點定時推送早報。其二:每隔乙個時間段就執行任務。比如:每隔乙個小時提醒自己起來走動走動,避免長時間坐著。今天,我跟大家分享下 python 定時任務的實現方法。第一種辦法是最簡單又最暴力。那就是在乙個死迴圈中,使用執行緒睡眠函式 sleep()。請參考: python定時任務(上)
python定時任務(下)
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...