在 Python 的應(yīng)用場(chǎng)景中,定時(shí)任務(wù)的需求十分常見(jiàn)。無(wú)論是定時(shí)清理日志文件、定期備份數(shù)據(jù),還是定時(shí)執(zhí)行網(wǎng)絡(luò)爬蟲(chóng)任務(wù),掌握 Python 實(shí)現(xiàn)定時(shí)任務(wù)的方法都能大大提升工作效率。接下來(lái)就跟小編一起來(lái)詳細(xì)介紹 Python 實(shí)現(xiàn)定時(shí)任務(wù)的 4 種常見(jiàn)方式。
一、使用time.sleep()函數(shù)實(shí)現(xiàn)簡(jiǎn)單定時(shí)
time.sleep()函數(shù)是 Python 標(biāo)準(zhǔn)庫(kù)time中的一個(gè)函數(shù),它可以讓程序暫停指定的秒數(shù),通過(guò)循環(huán)和該函數(shù)結(jié)合,能夠?qū)崿F(xiàn)簡(jiǎn)單的定時(shí)任務(wù)。這種方式適用于對(duì)時(shí)間精度要求不高,且邏輯較為簡(jiǎn)單的定時(shí)任務(wù)。
TypeScript取消自動(dòng)換行復(fù)制
import time
def task():
print("執(zhí)行定時(shí)任務(wù)")
while True:
task()
time.sleep(60) # 每隔60秒執(zhí)行一次任務(wù)
上述代碼定義了一個(gè)task函數(shù),通過(guò)while循環(huán)和time.sleep(60),讓task函數(shù)每隔 60 秒執(zhí)行一次。不過(guò)這種方式存在明顯的缺點(diǎn),它只是簡(jiǎn)單地讓程序暫停一段時(shí)間后執(zhí)行任務(wù),無(wú)法精確控制任務(wù)在特定時(shí)間點(diǎn)執(zhí)行,而且在任務(wù)執(zhí)行時(shí)間較長(zhǎng)時(shí),會(huì)影響定時(shí)的準(zhǔn)確性。

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