python 定時任務(調度任務)

Python 定時調度–APScheduler

APScheduler提供了基於日期、固定時間間隔以及crontab類型的任務,並且可以持久化任務。
APScheduler提供了多種不同的調度器,方便開發者根據自己的實際需要進行使用;同時也提供了不同的存儲機制,可以方便與Redis,數據庫等第三方的外部持久化機制進行協同工作,總之功能非常強大和易用。

APScheduler的主要的調度類
在APScheduler中有以下幾個非常重要的概念,需要大家理解:

觸發器(trigger)
包含調度邏輯,每一個作業有它自己的觸發器,用於決定接下來哪一個作業會運行,根據trigger中定義的時間點,頻率,時間區間等等參數設置。除了他們自己初始配置以外,觸發器完全是無狀態的。

作業存儲(job store)
存儲被調度的作業,默認的作業存儲是簡單地把作業保存在內存中,其他的作業存儲是將作業保存在數據庫中。一個作業的數據講在保存在持久化作業存儲時被序列化,並在加載時被反序列化。調度器不能分享同一個作業存儲。job store支持主流的存儲機制:redis, mongodb, 關係型數據庫, 內存等等

執行器(executor)
處理作業的運行,他們通常通過在作業中提交制定的可調用對象到一個線程或者進城池來進行。當作業完成時,執行器將會通知調度器。基於池化的操作,可以針對不同類型的作業任務,更爲高效地使用cpu的計算資源。

調度器(scheduler)
通常在應用只有一個調度器,調度器提供了處理這些的合適的接口。配置作業存儲和執行器可以在調度器中完成,例如添加、修改和移除作業。

這裏簡單列一下常用的若干調度器:

  • BlockingScheduler:僅可用在當前你的進程之內,與當前的進行共享計算資源
  • BackgroundScheduler: 在後臺運行調度,不影響當前的系統計算運行
  • AsyncIOScheduler: 如果當前系統中使用了async module,則需要使用異步的調度器
  • GeventScheduler: 如果使用了gevent,則需要使用該調度
  • TornadoScheduler: 如果使用了Tornado, 則使用當前的調度器
  • TwistedScheduler:Twister應用的調度器
  • QtScheduler: Qt的調度器
BlockingScheduler:  適合於只在進程中運行單個任務的情況,通常在調度器是你唯一要運行的東西時使用。
BackgroundScheduler: 適合於要求任何在程序後臺運行的情況,當希望調度器在應用後臺執行時使用。
AsyncIOScheduler:適合於使用asyncio框架的情況
GeventScheduler:  適合於使用gevent框架的情況
TornadoScheduler: 適合於使用Tornado框架的應用
TwistedScheduler: 適合使用Twisted框架的應用
QtScheduler:      適合使用QT的情況

add_job() 中 trigger 參數爲調用方式,有 interval, day, cron 三種值
date 日期:觸發任務運行的具體日期
interval 間隔:觸發任務運行的時間間隔
cron 週期:觸發任務運行的週期

觸發器date
特定的時間點觸發,只執行一次。參數如下:

定時任務:修改創建文件時間超過100s的文件的文件名
可以使用

import time
import datetime
import os
from dateutil.parser import parser




def TimeStamp2Time(timestamp):
    timestruct = time.localtime(timestamp)
    return time.strftime('%Y-%m-%d %H:%M:%S',timestruct)

def job(Path,now_time):
    files = os.listdir(Path)
    for file in files:
        if file.endswith('.txt'):
            filepath = Path+file
            try:
                t = os.path.getctime(filepath)
                creat_filetime = TimeStamp2Time(t)

                a = parser(now_time)
                b = parser(creat_filetime)
                time_diff = (a-b).total_seconds()
                if time_diff/100>1:
                    try:
                        new_filename = filepath[:4]+'.json'
                        os.rename(filepath,new_filename)
                    except:
                        print('rename fail')
            except:
                print(filepath,'is not exist!')

if __name__ == '__main__':
    Path = 'D:/data/images/'
    while True:
        now_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        job(Path,now_time)
        time.sleep(10)

https://www.cnblogs.com/BlueSkyyj/p/11678665.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章