首頁 > 軟體

python 實現定時任務的四種方式

2021-04-01 19:00:11

用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

以上就是python 實現定時任務的四種方式的詳細內容,更多關於python 實現定時任務的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com