前言
當(dāng)每隔一段時(shí)間就要執(zhí)行一段程序,或者往復(fù)循環(huán)執(zhí)行某一個(gè)任務(wù),這就需要使用定時(shí)任務(wù)來(lái)執(zhí)行程序。應(yīng)用很廣泛,可以實(shí)現(xiàn)程序的自動(dòng)化,而不需要我們手動(dòng)的在規(guī)定時(shí)間內(nèi)執(zhí)行。如爬蟲(chóng),如定時(shí)器等等。以下將介紹幾種pyhton常用的定時(shí)任務(wù)方法。
while True:+sleep()
import datetime
import time
def task():
now = datetime.datetime.now()
ts = now.strftime("%Y-%m-%d %H:%M:%S")
print(ts)
def func():
while True:
task()
time.sleep(5)
func()
優(yōu)點(diǎn)
執(zhí)行簡(jiǎn)單,代碼容易理解
缺點(diǎn)
只能實(shí)現(xiàn)同步任務(wù),控制困難,而且sleep是個(gè)阻塞函數(shù)。應(yīng)用面也小,只能設(shè)置間隔,而不能指定具體的時(shí)間點(diǎn)。
threading.Timer定時(shí)器
timer最就是定時(shí)器,可以啟動(dòng)多個(gè)定時(shí)任務(wù),且是異步執(zhí)行,所以不存在等待順序執(zhí)行問(wèn)題。timer常用的幾種方法:
方法 | 說(shuō)明 |
---|---|
Timer(interval, function, args=None, kwargs=None) | 創(chuàng)建定時(shí)器 |
cancel() | 取消定時(shí)器 |
start() | 使用線程方式執(zhí)行 |
join(self, timeout=None) | 等待線程執(zhí)行結(jié)束 |
from datetime import datetime
from threading import Timer
def task():
now = datetime.now()
ts = now.strftime("%Y-%m-%d %H:%M:%S")
print(ts)
def func():
task()
# 定義一個(gè)定時(shí)器
# 注意timer的語(yǔ)法
# Timer(interval, function, args=None, kwargs=None)
t = Timer(3, func)
t.start()
func()
多線程執(zhí)行
from datetime import datetime
from threading import Timer
import threading
def task():
now = datetime.now()
ts = now.strftime("%Y-%m-%d %H:%M:%S")
print(ts)
def func():
task()
t = Timer(3, func)
t.start()
if __name__ == '__main__':
for i in range(3):
thread = threading.Thread(None, func)
thread.start()
優(yōu)點(diǎn)
可以實(shí)現(xiàn)異步任務(wù),是非阻塞的。
缺點(diǎn)
但當(dāng)運(yùn)行次數(shù)過(guò)多時(shí),會(huì)出現(xiàn)報(bào)錯(cuò):Pyinstaller maximum recursion depth exceeded Error Resolution 達(dá)到最大遞歸深度,然后想到的是修改最大遞歸深度,但是運(yùn)行到達(dá)到最大CPU時(shí),python會(huì)直接銷毀程序。
Timeloop庫(kù)執(zhí)行定時(shí)任務(wù)
Timeloop是一個(gè)庫(kù),可用于運(yùn)行多周期任務(wù)。這是一個(gè)簡(jiǎn)單的庫(kù),使用decorator模式在線程中運(yùn)行標(biāo)記函數(shù)。
from datetime import datetime, timedelta
from timeloop import Timeloop
tl = Timeloop()
def task():
now = datetime.now()
ts = now.strftime("%Y-%m-%d %H:%M:%S")
print(ts + '333!')
def task2():
now = datetime.now()
ts = now.strftime("%Y-%m-%d %H:%M:%S")
print(ts + "555555!")
@tl.job(interval=timedelta(seconds=2))
def sample_job_every_2s():
task()
@tl.job(interval=timedelta(seconds=5))
def sample_job_every_5s():
task2()
調(diào)度模塊schedule
schedule是一個(gè)第三方輕量級(jí)的任務(wù)調(diào)度模塊,可以按照秒,分,小時(shí),日期或者自定義事件執(zhí)行時(shí)間。
如果想執(zhí)行多個(gè)任務(wù),也可以添加多個(gè)task。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-442645.html
import schedule
from datetime import datetime
def task():
now = datetime.now()
ts = now.strftime("%Y-%m-%d %H:%M:%S")
print(ts)
def task2():
now = datetime.now()
ts = now.strftime("%Y-%m-%d %H:%M:%S")
print(ts + '666!')
def func():
# 清空任務(wù)
schedule.clear()
# 創(chuàng)建一個(gè)按3秒間隔執(zhí)行任務(wù)
schedule.every(3).seconds.do(task)
# 創(chuàng)建一個(gè)按2秒間隔執(zhí)行任務(wù)
schedule.every(2).seconds.do(task2)
while True:
schedule.run_pending()
func()
優(yōu)缺點(diǎn)
需要和while Ture配合使用,而且占用的CPU也比其他幾種多的多,占用內(nèi)存也是較大。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-442645.html
到了這里,關(guān)于【Python--定時(shí)任務(wù)的四種方法】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!