python定时任务_Python定时任务(上)
在項目中,我們可能遇到有定時任務(wù)的需求。其一:定時執(zhí)行任務(wù)。例如每天早上 8 點定時推送早報。其二:每隔一個時間段就執(zhí)行任務(wù)。比如:每隔一個小時提醒自己起來走動走動,避免長時間坐著。今天,我跟大家分享下 Python 定時任務(wù)的實現(xiàn)方法。
1
第一種辦法是最簡單又最暴力。那就是在一個死循環(huán)中,使用線程睡眠函數(shù) sleep()。
from datetime import datetime
import time
'''每個 10 秒打印當(dāng)前時間。'''
def timedTask():
while True:
print(datetime.now().strftime("%Y-%m-%d%H:%M:%S"))
time.sleep(10)
if __name__ == '__main__':
timedTask()
這種方法能夠執(zhí)行固定間隔時間的任務(wù)。如果timedTask()函數(shù)之后還有些操作,我們還使用死循環(huán) + 阻塞線程。這會使得timedTask()一直占有 CPU 資源,導(dǎo)致后續(xù)操作無法執(zhí)行。我建議謹(jǐn)重使用。
2
既然第一種方法暴力,那么有沒有比較優(yōu)雅地方法?答案是肯定的。Python 標(biāo)準(zhǔn)庫 threading 中有個 Timer 類。它會新啟動一個線程來執(zhí)行定時任務(wù),所以它是非阻塞函式。
如果你有使用多線程的話,需要關(guān)心線程安全問題。那么你可以選使用threading.Timer模塊。
from datetime import datetime
from threading import Timer
import time
'''
每個 10 秒打印當(dāng)前時間。
'''
def timedTask():
'''
第一個參數(shù): 延遲多長時間執(zhí)行任務(wù)(單位: 秒)
第二個參數(shù): 要執(zhí)行的任務(wù), 即函數(shù)
第三個參數(shù): 調(diào)用函數(shù)的參數(shù)(tuple)
'''
Timer(10, task, ()).start()
# 定時任務(wù)
def task():
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
if __name__ == '__main__':
timedTask()
while True:
print(time.time())
time.sleep(5)
運行結(jié)果:
1512486945.1196375
1512486950.119873
2017-12-05 23:15:50
1512486955.133385
3
第三種方式是也是使用標(biāo)準(zhǔn)庫中sched模塊。sched 是事件調(diào)度器,它通過 scheduler 類來調(diào)度事件,從而達(dá)到定時執(zhí)行任務(wù)的效果。
sched庫使用起來也是非常簡單。
1)首先構(gòu)造一個sched.scheduler類
它接受兩個參數(shù):timefunc 和 delayfunc。timefunc 應(yīng)該返回一個數(shù)字,代表當(dāng)前時間,delayfunc 函數(shù)接受一個參數(shù),用于暫停運行的時間單元。
一般使用默認(rèn)參數(shù)就行,即傳入這兩個參數(shù) time.time 和 time.sleep.當(dāng)然,你也可以自己實現(xiàn)時間暫停的函數(shù)。
2)添加調(diào)度任務(wù)
scheduler 提供了兩個添加調(diào)度任務(wù)的函數(shù):enter(delay, priority, action, argument=(), kwargs={})
該函數(shù)可以延遲一定時間執(zhí)行任務(wù)。delay 表示延遲多長時間執(zhí)行任務(wù),單位是秒。priority為優(yōu)先級,越小優(yōu)先級越大。兩個任務(wù)指定相同的延遲時間,優(yōu)先級大的任務(wù)會向被執(zhí)行。action 即需要執(zhí)行的函數(shù),argument 和 kwargs 分別是函數(shù)的位置和關(guān)鍵字參數(shù)。scheduler.enterabs(time, priority, action, argument=(), kwargs={})
添加一項任務(wù),但這個任務(wù)會在 time 這時刻執(zhí)行。因此,time 是絕對時間.其他參數(shù)用法與 enter() 中的參數(shù)用法是一致。
3)把任務(wù)運行起來
調(diào)用 scheduler.run()函數(shù)就完事了。
下面是 sche 使用的簡單示例:
from datetime import datetime
import sched
import time
'''
每個 10 秒打印當(dāng)前時間。
'''
def timedTask():
# 初始化 sched 模塊的 scheduler 類
scheduler = sched.scheduler(time.time, time.sleep)
# 增加調(diào)度任務(wù)
scheduler.enter(10, 1, task)
# 運行任務(wù)
scheduler.run()
# 定時任務(wù)
def task():
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
if __name__ == '__main__':
timedTask()
值得注意的是: scheduler 中的每個調(diào)度任務(wù)只會工作一次,不會無限循環(huán)被調(diào)用。如果想重復(fù)執(zhí)行同一任務(wù), 需要重復(fù)添加調(diào)度任務(wù)即可。
推薦閱讀:
本文原創(chuàng)發(fā)布于微信公眾號「極客猴」,歡迎關(guān)注第一時間獲取更多原創(chuàng)分享
【極客猴】每周堅持分享 Python 原創(chuàng)干貨的公眾號。包括基礎(chǔ)入門,進(jìn)階技巧,網(wǎng)絡(luò)爬蟲,數(shù)據(jù)分析, Web 應(yīng)用開發(fā)等,歡迎關(guān)注。
總結(jié)
以上是生活随笔為你收集整理的python定时任务_Python定时任务(上)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 成都大熊猫基地分上午场下午场
- 下一篇: python云计算开发技术_云计算开发学