在 Python 的應(yīng)用場景中,定時任務(wù)的需求十分常見。無論是定時清理日志文件、定期備份數(shù)據(jù),還是定時執(zhí)行網(wǎng)絡(luò)爬蟲任務(wù),掌握 Python 實現(xiàn)定時任務(wù)的方法都能大大提升工作效率。接下來就跟小編一起來詳細(xì)介紹 Python 實現(xiàn)定時任務(wù)的 4 種常見方式。
一、使用time.sleep()函數(shù)實現(xiàn)簡單定時
time.sleep()函數(shù)是 Python 標(biāo)準(zhǔn)庫time中的一個函數(shù),它可以讓程序暫停指定的秒數(shù),通過循環(huán)和該函數(shù)結(jié)合,能夠?qū)崿F(xiàn)簡單的定時任務(wù)。這種方式適用于對時間精度要求不高,且邏輯較為簡單的定時任務(wù)。
TypeScript取消自動換行復(fù)制
import time
def task():
print("執(zhí)行定時任務(wù)")
while True:
task()
time.sleep(60) # 每隔60秒執(zhí)行一次任務(wù)
上述代碼定義了一個task函數(shù),通過while循環(huán)和time.sleep(60),讓task函數(shù)每隔 60 秒執(zhí)行一次。不過這種方式存在明顯的缺點,它只是簡單地讓程序暫停一段時間后執(zhí)行任務(wù),無法精確控制任務(wù)在特定時間點執(zhí)行,而且在任務(wù)執(zhí)行時間較長時,會影響定時的準(zhǔn)確性。
二、使用schedule庫實現(xiàn)靈活定時
schedule庫是一個第三方庫,它提供了簡潔的語法,能夠方便地實現(xiàn)各種定時任務(wù),支持按秒、分鐘、小時、天等時間單位進行定時,甚至可以自定義復(fù)雜的定時規(guī)則。使用前需要先通過pip install schedule命令安裝該庫。
TypeScript取消自動換行復(fù)制
import schedule
import time
def job():
print("定時任務(wù)執(zhí)行中...")
# 每隔1分鐘執(zhí)行一次任務(wù)
schedule.every(1).minutes.do(job)
while True:
schedule.run_pending()
time.sleep(1)
在上述代碼中,通過schedule.every(1).minutes.do(job)設(shè)定任務(wù)每分鐘執(zhí)行一次,schedule.run_pending()函數(shù)會檢查是否有任務(wù)到期需要執(zhí)行。schedule庫的優(yōu)勢在于語法簡單直觀,能夠滿足大多數(shù)常見的定時需求,但它在多任務(wù)復(fù)雜調(diào)度以及長期穩(wěn)定運行方面存在一定局限性。
三、使用APScheduler庫實現(xiàn)復(fù)雜定時任務(wù)
APScheduler是一個強大的 Python 定時任務(wù)調(diào)度庫,它支持多種定時任務(wù)類型,如固定時間間隔、固定時間點(日期)、 cron 表達(dá)式等,還能將任務(wù)存儲在數(shù)據(jù)庫中,實現(xiàn)任務(wù)的持久化和分布式調(diào)度。安裝方式為pip install apscheduler。
1. 基于間隔時間的定時任務(wù)
TypeScript取消自動換行復(fù)制
from apscheduler.schedulers.blocking import BlockingScheduler
def my_task():
print("基于間隔時間的任務(wù)執(zhí)行了")
scheduler = BlockingScheduler()
scheduler.add_job(my_task, 'interval', seconds=10) # 每隔10秒執(zhí)行一次
scheduler.start()
2. 基于固定時間點的定時任務(wù)
TypeScript取消自動換行復(fù)制
from apscheduler.schedulers.blocking import BlockingScheduler
import datetime
def my_task():
print("基于固定時間點的任務(wù)執(zhí)行了")
scheduler = BlockingScheduler()
# 在每天的10:30:00執(zhí)行任務(wù)
scheduler.add_job(my_task, 'date', run_date=datetime.datetime(2024, 1, 1, 10, 30, 0))
scheduler.start()
3. 基于 cron 表達(dá)式的定時任務(wù)
TypeScript取消自動換行復(fù)制
from apscheduler.schedulers.blocking import BlockingScheduler
def my_task():
print("基于cron表達(dá)式的任務(wù)執(zhí)行了")
scheduler = BlockingScheduler()
# 每天凌晨1點執(zhí)行任務(wù)
scheduler.add_job(my_task, 'cron', hour=1)
scheduler.start()
APScheduler功能豐富,能夠滿足復(fù)雜的定時任務(wù)需求,在企業(yè)級開發(fā)和服務(wù)器端任務(wù)調(diào)度中應(yīng)用廣泛,但它的配置相對復(fù)雜,對于初學(xué)者上手難度較高。
四、使用Windows任務(wù)計劃程序或Linux的crontab實現(xiàn)系統(tǒng)級定時
在 Windows 系統(tǒng)中,可以使用任務(wù)計劃程序來定時執(zhí)行 Python 腳本。先將 Python 腳本保存好,然后打開任務(wù)計劃程序,創(chuàng)建基本任務(wù),按照向?qū)崾驹O(shè)置任務(wù)名稱、描述、觸發(fā)條件(定時時間)以及要執(zhí)行的操作(指定 Python 解釋器路徑和腳本路徑),即可實現(xiàn)定時執(zhí)行 Python 腳本。
在 Linux 系統(tǒng)中,crontab是常用的定時任務(wù)工具。編輯crontab文件(使用crontab -e命令),按照crontab的語法格式添加任務(wù)。例如,要每天凌晨 2 點執(zhí)行/home/user/my_script.py這個 Python 腳本,可以添加如下內(nèi)容:
使用系統(tǒng)級定時方式的好處是利用了操作系統(tǒng)本身的調(diào)度功能,穩(wěn)定性高,并且不依賴 Python 程序自身的運行狀態(tài)。但它的配置與系統(tǒng)緊密相關(guān),跨平臺性較差。
以上就是 Python 實現(xiàn)定時任務(wù)的 4 種常見方式,每種方式都有其適用場景和優(yōu)缺點。在實際開發(fā)中,可以根據(jù)具體需求選擇合適的方式,實現(xiàn)高效、穩(wěn)定的定時任務(wù)調(diào)度。