Python定時任務(上)

2021-02-25 極客猴

Photo from Unsplash

 在項目中,我們可能遇到有定時任務的需求。其一:定時執行任務。例如每天早上 8 點定時推送早報。其二:每隔一個時間段就執行任務。比如:每隔一個小時提醒自己起來走動走動,避免長時間坐著。今天,我跟大家分享下 Python 定時任務的實現方法。


第一種辦法是最簡單又最暴力。那就是在一個死循環中,使用線程睡眠函數 sleep()。

from datetime import datetime
import time

'''
每個 10 秒列印當前時間。
'''
def timedTask():
   while True:
       print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
       time.sleep(10)

if __name__ == '__main__':
   timedTask()

這種方法能夠執行固定間隔時間的任務。如果 timedTask() 函數之後還有些操作,我們還使用死循環 + 阻塞線程。這會使得 timedTask() 一直佔有 CPU 資源,導致後續操作無法執行。我建議謹重使用。


既然第一種方法暴力,那麼有沒有比較優雅地方法?答案是肯定的。Python 標準庫 threading 中有個 Timer 類。它會新啟動一個線程來執行定時任務,所以它是非阻塞函式。


如果你有使用多線程的話,需要關心線程安全問題。那麼你可以選使用  threading.Timer 模塊。

from datetime import datetime
from threading import Timer
import time

'''
每個 10 秒列印當前時間。
'''
def timedTask():
   '''
   第一個參數: 延遲多長時間執行任務(單位: 秒)
   第二個參數: 要執行的任務, 即函數
   第三個參數: 調用函數的參數(tuple)
   '''
   Timer(10, task, ()).start()


def task():
   print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))

if __name__ == '__main__':
   timedTask()
   while True:
       print(time.time())
       time.sleep(5)


運行結果:


第三種方式是使用標準庫中 sched 模塊。sched 是事件調度器,它通過  scheduler 類來調度事件,從而達到定時執行任務的效果。


sched 庫使用起來也是非常簡單。

1)首先構造一個 sched.scheduler

它接受兩個參數: timefunc 和  delayfunc。timefunc 應該返回一個數字,代表當前時間,delayfunc 函數接受一個參數,用於暫停運行的時間單元。


一般使用默認參數就行,即傳入這兩個參數 `time.time` 和 `time.sleep`.當然,你也可以自己實現時間暫停的函數。


2)添加調度任務

scheduler 提供了兩個添加調度任務的函數:


enter(delay, priority, action, argument=(), kwargs={})

該函數可以延遲一定時間執行任務。delay 表示延遲多長時間執行任務,單位是秒。priority 為優先級,越小優先級越大。兩個任務指定相同的延遲時間,優先級大的任務會向被執行。action 即需要執行的函數,argument  和  kwargs 分別是函數的位置和關鍵字參數。


scheduler.enterabs(time, priority, action, argument=(), kwargs={})

添加一項任務,但這個任務會在 time 這時刻執行。因此,time 是絕對時間.其他參數用法與 enter() 中的參數用法是一致。


3)把任務運行起來

調用 scheduler.run() 函數就完事了。


下面是 sche 使用的簡單示例:

from datetime import datetime
import sched
import time

'''
每個 10 秒列印當前時間。
'''
def timedTask():
   
   scheduler = sched.scheduler(time.time, time.sleep)
   
   scheduler.enter(10, 1, task)
   
   scheduler.run()


def task():
   print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))

if __name__ == '__main__':
   timedTask()


值得注意的是: scheduler 中的每個調度任務只會工作一次,不會無限循環被調用。如果想重複執行同一任務, 需要重複添加調度任務即可。

作者:猴哥

公眾號:極客猴

愛好讀書,喜歡鑽研技術,夢想成為文藝青年的 boy。


相關焦點

  • Python開發:Win10創建定時任務執行Python腳本
    :  Win10創建定時任務  電腦桌面→我的電腦→右鍵→管理  計算機管理→系統工具→任務計劃程序→創建基本任務    選擇任務計劃程序    創建基本任務  創建基本任務之後,可以通過歷史記錄查看當前任務的執行信息,如果任務歷史記錄被禁用,可以點擊右側的 啟用所有任務歷史記錄 按鈕
  • Python 實現定時任務的八種方案!
    https://jinshuju.net/f/JEvW46點擊連結學習更多python知識目錄利用while True: + sleep()實現定時任務使用數據流工具Apache Airflow實現定時任務利用while True: + sleep()實現定時任務
  • python定時任務管理
    '''def timedTask():''' 第一個參數: 延遲多長時間執行任務(單位: 秒) 第二個參數: 要執行的任務, 即函數 第三個參數: 調用函數的參數(tuple) '''Timer(10, task, ()).start()# 定時任務
  • 如何用Python發送定時郵件?
    Python 發送定時郵件的小技巧 之前接了一個爬蟲的小項目,需要每天將數據發送到客戶的郵箱中,每天都登錄伺服器下載數據十分麻煩,因此就用 Python 配合 Windows 系統自帶的任務計劃,每天上午 10:00 定時將當天的數據發到客戶郵箱中。
  • python定時獲取天氣數據並自動發送到郵箱
    這篇文章我們就來談談如何獲取天氣數據,並定時將天氣數據發送到指定的郵箱中?它在python內置模塊的基礎上進行了高度的封裝,從而使得python進行網絡請求時,變得人性化,使用Requests可以輕而易舉地完成瀏覽器可有的任何操作。使用它最重要的一個方法就是get方法,它能獲取到所請求頁面的html信息。
  • 用Python給女朋友定時發簡訊
    urllib2可用來完成以下功能:獲取Web頁面在遠程http伺服器上驗證額外數據請求,如表單提交(GET和POST)異常處理非http協議通信(如FTP)https://docs.python.org/2/library/urllib.html類似上面小節,我想著肯定也有開放的API,但是這次就沒那麼幸運了,簡訊API
  • Python實現定時執行任務的三種方式簡單示例
    本文實例講述了Python實現定時執行任務的三種方式。分享給大家供大家參考,具體如下: 1.定時任務代碼 2.周期性執行任務
  • Python 每天定時發送一句情話|原力計劃
    定位情話資源滑鼠放在我們要爬取的情話上快速按下右鍵+檢查(元素)。先在就可以看到我們的情話在頁面中是什麼位置了。2. 定位標籤在開發者工具中,我們輕鬆的舊定位到了我們的情話的標籤,就是上圖紅框裡的內容。3.
  • 為什麼你的 Spring Task 定時任務沒有定時執行?
    定時任務阻塞會有什麼影響?多個定時任務的情況下是如何運行的?具有相同表達式的定時任務,他們的執行順序如何?為什麼async異步任務沒有生效?所以這篇文章,我們來介紹一下,在 Spring Task 中, 定時任務的執行原理及相關問題。
  • 《堡壘之夜》車輛定時實驗任務攻略 車輛定時實驗任務怎麼完成
    導 讀 堡壘之夜第6賽季第10周更新了不少任務,車輛定時實驗正是當中之一,該任務需要宣召光標,那麼這些光標位置在哪
  • 20行Python代碼寫了小姐姐語音提示軟體,定時休息!
    點上方「菜鳥學Python
  • SpringBoot定時任務:schedule、quartz
    Scheduled只適合處理簡單的計劃任務,不能處理分布式計劃任務。優勢:是spring框架提供的計劃任務,開發簡單,執行效率比較高。且在計劃任務數量太多的時候,可能出現阻塞,崩潰,延遲啟動等問題。Scheduled定時任務是spring3.0版本之後自帶的一個定時任務。
  • 初探SpringBoot整合Quartz定時任務
    定時任務有很多實現的方式,包括timer,timertask,scheduledexecutorservice,以及第三方框架Quartz。本篇文章主要介紹SpringBoot整合Quartz實現動態定時任務。1、Quartz是功能強大的開源作業調度庫,可以創建簡單或複雜的計劃,可以運行十個,百個,甚至幾萬個Jobs這樣複雜的日程序表。
  • Spring 定時任務玩出花!
    在這個項目中,每一個定時任務都由一個線程去處理,負責處理每一個定時任務的線程類是 SchedulingRunnable,所有的線程都跑在一個線程池中,這個線程池是 ThreadPoolTaskScheduler,這是一個專為定時任務設計的線程池(支持 Cron 表達式),它的底層其實就是大家所熟知的 ScheduledThreadPoolExecutor
  • 定時後臺運行Python程序
    大型程序中經常會需要定時運行某些任務,比如生成報表,發郵件等。複雜的方法會用到消息隊列,用API調用一個接口定時運行你的任務。簡單的用Cron或者Windows裡的計劃任務。而Python提供了一個更簡單的方法。Cron需要的是給出一行指定時間範圍。
  • 定時任務實現原理詳解
    一、摘要在很多業務的系統中,我們常常需要定時的執行一些任務,例如定時發簡訊、定時變更數據、定時發起促銷活動等等。在上篇文章中,我們簡單的介紹了定時任務的使用方式,不同的架構對應的解決方案也有所不同,總結起來主要分單機和分布式兩大類,本文會重點分析下單機的定時任務實現原理以及優缺點,分布式框架的實現原理會在後續文章中進行分析。
  • PHP實現執行定時任務的幾種思路詳解
    好了,已經添加了幾條需要的定時任務了吧。點擊鍵盤上的Esc鍵,輸入「:wq」回車,這樣就保存了設置的定時任務,屏幕上也能看到提示創建了新的定時任務。接下來就是好好寫你的script.php了。關於CronTab的更多用法這裡就不介紹了,如果你想更靈活的使用這個定時任務功能,應該自己再去深入學習一下crontab。
  • PHP在Linux下執行定時任務的實現思路詳解
    好了,已經添加了幾條需要的定時任務了吧。點擊鍵盤上的Esc鍵,輸入「:wq」回車,這樣就保存了設置的定時任務,屏幕上也能看到提示創建了新的定時任務。接下來就是好好寫你的script.php了。實際上在windows上定時任務,和linux上道理是一樣的,只不過方法和途徑不同。好了下面開始。
  • 學會這 10 種定時任務,我有點飄了
    前言在不用的業務場景下要用不同的定時任務,其實我們的選擇還是挺多的。本文總結了 10 種非常實用的定時任務,總有一種是適合你的。一. linux 自帶的定時任務crontab不知道你有沒有遇到過這種場景:有時需要臨時統計線上的數據,然後導出到 excel 表格中。
  • 無需後端,小程序全自動定時推送模板消息系統
    我們只需要使用古人云小程序開發平臺的推送API+任務腳本功能,就可以實現一個全自動的每天定時爬取更新系統啦!小程序推送API提示:這裡的默認數據,會在後期我們調用API的時候進行覆蓋腳本代碼再然後,我們獲取到了這個推送API的地址和密鑰,我們就開始編寫一個定時任務腳本了