用Python實作定時任務
有些時候我們需要每隔一段時間就要執行一段程式,或者是往復回圈執行某一個任務,比如博主在上篇文章講的爬蟲一樣,在實作對某個目標進行在線爬取的話,也需要用到實時任務,
用Python實作定時任務的四種方法
- while True: + sleep()
- threading.Timer定時器
- 調度模塊schedule
- 任務框架APScheduler
定時要完成的Task(簡單定義下)
import datetime
def Task():
now = datetime.datetime.now()
ts = now.strftime('%Y-%m-%d %H:%M:%S')
print(ts)
利用while True: + sleep()實作定時任務
第一個想到的肯定就行while:true + sleep組合了吧,簡單粗暴,實作如下
def loopMonitor():
while True:
Task()
# 3s檢查一次
time.sleep(3)
這種方法的缺點是只能實作同步任務,無法執行異步任務
利用threading.Timer定時器實作定時任務
from threading import Timer
def timerMonitor():
Task()
t = Timer(3, timerMonitor)
t.start()
出現的問題是,運行次數過多時,會出現報錯:Pyinstaller maximum recursion depth exceeded Error Resolution
達到最大遞回深度,然后想到的是修改最大遞回深度
sys.setrecursionlimit(100000000)
但是運行到達到最大CPU時,python會直接銷毀程式,涼涼0.0
利用調度模塊schedule實作定時任務
schedule是一個第三方輕量級的任務調度模塊,可以按照秒,分,小時,日期或者自定義事件執行時間
如果想執行多個任務,也可以添加多個task
代碼見下
import schedule
def scheduleMonitor():
# 清空任務
schedule.clear()
# 創建一個按3秒間隔執行任務
schedule.every(3).seconds.do(Task)
# 創建一個按2秒間隔執行任務
schedule.every(2).seconds.do(Task)
while True:
schedule.run_pending()
但是他依然需要和while Ture配合使用,而且占用的CPU也比其他幾種多的多,
利用任務框架APScheduler實作定時任務
APScheduler是Python的一個定時任務框架,用于執行周期或者定時任務,該框架不僅可以添加、洗掉定時任務,還可以將任務存盤到資料庫中,實作任務的持久化,使用起來非常方便,
from apscheduler.schedulers.blocking import BlockingScheduler
def APschedulerMonitor():
# 創建調度器:BlockingScheduler
scheduler = BlockingScheduler()
scheduler.add_job(Task, 'interval', seconds=3, id='test_job1')
# 添加任務,時間間隔5S
scheduler.add_job(Task, 'interval', seconds=5, id='test_job2')
scheduler.start()
總結
1:回圈+sleep方式可以用來做簡單測驗,
2:timer可以實作異步定時任務,
3:schedule可以定點定時執行,但是仍然需要while Ture配合,而且占用記憶體大,
4:APScheduler框架更加強大,可以直接在里面添加定點與定時任務,無可挑剔,
所以,用誰不用我說了吧QAQ

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/271572.html
標籤:python
上一篇:爬蟲入門bs4之多執行緒
