玩家必看科普!麻豆人人妻人人妻人人片AV,欧美老妇交乱视频在线观看,久久综合九色综合久99_知乎
<ruby id="fgcka"></ruby>
  • <progress id="fgcka"></progress>
    <tbody id="fgcka"></tbody>
    <dd id="fgcka"></dd>

    1. <dd id="fgcka"></dd>

      <em id="fgcka"></em>
        1. 系統城裝機大師 - 固鎮縣祥瑞電腦科技銷售部宣傳站!

          當前位置:首頁 > 腳本中心 > python > 詳細頁面

          python apscheduler cron定時任務觸發接口自動化巡檢過程

          時間:2023-03-15來源:系統城裝機大師作者:佚名

          python cron定時任務觸發接口自動化巡檢

          定時任務觸發方式有幾種類型,日常的工作中,研發同學運用比較多的就是cron方式

          查了一下APScheduler框架內支持多種定時任務方式

          首先先安裝apscheduler模塊

          1 $ pip install apscheduler

          代碼如下:(在方法內注釋了各種時間參數的定義與范圍)

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          15
          16
          17
          18
          19
          20
          21
          22
          23
          24
          25
          26
          27
          28
          29
          30
          31
          32
          33
          34
          35
          36
          37
          38
          39
          40
          41
          42
          43
          44
          45
          46
          47
          48
          49
          50
          51
          52
          from apscheduler.schedulers.blocking import BlockingScheduler
           
           
          class Timing:
              def __init__(self, start_date, end_date, hour=None):
                  self.start_date = start_date
                  self.end_date = end_date
                  self.hour = hour
           
              def cron(self, job, *value_list):
                  """cron格式 在特定時間周期性地觸發"""
                  # year (int 或 str) – 年,4位數字
                  # month (int 或 str) – 月 (范圍1-12)
                  # day (int 或 str) – 日 (范圍1-31)
                  # week (int 或 str) – 周 (范圍1-53)
                  # day_of_week (int 或 str) – 周內第幾天或者星期幾 (范圍0-6 或者 mon,tue,wed,thu,fri,sat,sun)
                  # hour (int 或 str) – 時 (范圍0-23)
                  # minute (int 或 str) – 分 (范圍0-59)
                  # second (int 或 str) – 秒 (范圍0-59)
                  # start_date (datetime 或 str) – 最早開始日期(包含)
                  # end_date (datetime 或 str) – 分 最晚結束時間(包含)
                  # timezone (datetime.tzinfo 或str) – 指定時區
                  scheduler = BlockingScheduler()
                  scheduler.add_job(job, 'cron', start_date=self.start_date, end_date=self.end_date, hour=self.hour,
                                    args=[*value_list])
                  scheduler.start()
           
              def interval(self, job, *value_list):
                  """interval格式 周期觸發任務"""
                  # weeks (int) - 間隔幾周
                  # days (int)  - 間隔幾天
                  # hours (int) - 間隔幾小時
                  # minutes (int) - 間隔幾分鐘
                  # seconds (int) - 間隔多少秒
                  # start_date (datetime 或 str) - 開始日期
                  # end_date (datetime 或 str) - 結束日期
                  # timezone (datetime.tzinfo 或str) - 時區
                  scheduler = BlockingScheduler()
                  # 在 2019-08-29 22:15:00至2019-08-29 22:17:00期間,每隔1分30秒 運行一次 job 方法
                  scheduler.add_job(job, 'interval', minutes=1, seconds=30, start_date=self.start_date,
                                    end_date=self.end_date, args=[*value_list])
                  scheduler.start()
           
              @staticmethod
              def date(job, *value_list):
                  """date格式 特定時間點觸發"""
                  # run_date (datetime 或 str) - 作業的運行日期或時間
                  # timezone (datetime.tzinfo 或 str)  - 指定時區
                  scheduler = BlockingScheduler()
                  # 在 2019-8-30 01:00:01 運行一次 job 方法
                  scheduler.add_job(job, 'date', run_date='2019-8-30 01:00:00', args=[*value_list])
                  scheduler.start()

           

          封裝的方法不是很通用,后面會優化一下代碼,但最起碼現在是能用的,哈哈哈哈哈哈

          思考了一下思路,巡檢觸發任務,然后觸發釘釘,所以定時任務應該是在最上層

          之前分享的釘釘封裝的代碼內底部繼續完善一下

          1
          2
          3
          4
          5
          6
          7
          8
          if __name__ == '__main__':
              file_list = ["test_shiyan.py", "MeetSpringFestival.py"]
              # run_py(file_list)
              case_list = ["test_case_01", "test_case_02"]
              # run_case(test_sample, case_list)
              dingDing_list = [2, case_list, test_sample]
              # run_dingDing(*dingDing_list)
              Timing('2022-02-15 00:00:00', '2022-02-16 00:00:00', '0-23').cron(run_dingDing, *dingDing_list)

          把run_dingDing()的函數我們放在已經封裝好的Timing().cron(run_dingDing,*dingDing_list)內,那么run_dingDing()內的參數我們通過元組的方式傳入

          就是我們上面寫的這里能看到

          1
          2
          3
          4
          def cron(self, job, *value_list):
                  """cron格式 在特定時間周期性地觸發"""
                  scheduler.add_job(job, 'cron', start_date=self.start_date, end_date=self.end_date, hour=self.hour,
                                            args=[*value_list])

          時間范圍的填寫我放在了Timing()初始化內,看著舒服一點

          在運行Timing().cron()后就可以觸發定時了,但是必須要開著電腦才可以,等后面開始研究平臺,存儲在服務器內就美吱吱了~

          apscheduler報錯:Run time of job …… next run at: ……)” was missed by

          apscheduler 運行過程中出現類似如下報錯:

           Run time of job "9668_hack (trigger: interval[1:00:00], next run at: 2018-10-29 22:00:00 CST)" was missed by 0:01:47.387821Run time of job "9668_index (trigger: interval[0:30:00], next run at: 2018-10-29 21:30:00 CST)" was missed by 0:01:47.392574Run time of job "9669_deep (trigger: interval[1:00:00], next run at: 2018-10-29 22:00:00 CST)" was missed by 0:01:47.397622Run time of job "9669_hack (trigger: interval[1:00:00], next run at: 2018-10-29 22:00:00 CST)" was missed by 0:01:47.402938Run time of job "9669_index (trigger: interval[0:30:00], next run at: 2018-10-29 21:30:00 CST)" was missed by 0:01:47.407996 

          針對該問題百度是基本上指不上了,google到了關鍵配置,但仍然出現該報錯,于是繼續找資料,刨根問底這到是什么鬼問題導致的。

          misfire_grace_time參數

          google 到的是github上的一個issue:https://github.com/agronholm/apscheduler/issues/146

          里面說到了一個參數:misfire_grace_time,但是這個參數到底是干嘛用的,在其他地方找到了解釋,其中涉及到幾個其他參數,但是結合自己的理解綜合總結一下

          • coalesce:當由于某種原因導致某個job積攢了好幾次沒有實際運行(比如說系統掛了5分鐘后恢復,有一個任務是每分鐘跑一次的,按道理說這5分鐘內本來是“計劃”運行5次的,但實際沒有執行),如果coalesce為True,下次這個job被submit給executor時,只會執行1次,也就是最后這次,如果為False,那么會執行5次(不一定,因為還有其他條件,看后面misfire_grace_time的解釋)
          • max_instance:就是說同一個job同一時間最多有幾個實例再跑,比如一個耗時10分鐘的job,被指定每分鐘運行1次,如果我們max_instance值為5,那么在第6~10分鐘上,新的運行實例不會被執行,因為已經有5個實例在跑了
          • misfire_grace_time:設想和上述coalesce類似的場景,如果一個job本來14:00有一次執行,但是由于某種原因沒有被調度上,現在14:01了,這個14:00的運行實例被提交時,會檢查它預訂運行的時間和當下時間的差值(這里是1分鐘),大于我們設置的30秒限制,那么這個運行實例不會被執行。

          示例:

          15分鐘一次的的任務,misfire_grace_time 設置100秒,在0:06分的時候提示:

          Run time of job "9392_index (trigger: interval[0:15:00], next run at: 2018-10-27 00:15:00 CST)" was missed by 0:06:03.931026  

          解釋:

          • 本來應該在0:00執行的任務,某種原因沒有被調度,提示下次運行(0:15)與當前差了6分鐘(閾值100秒),所以0:15的時候將不會運行
          • 所以這個參數可以通俗的理解為任務的超時容錯配置,給executor 一個超時時間,這個時間范圍內要是該跑的還沒跑完,你TND的就別再跑了。

          于是我修改了配置如下:

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          15
          16
          17
          class Config(object):
           
             SCHEDULER_JOBSTORES = {
                 'default': RedisJobStore(db=3,host='0.0.0.0', port=6378,password='******'),
             }
           
             SCHEDULER_EXECUTORS = {
                 'default': {'type': 'processpool', 'max_workers': 50#用進程池提升任務處理效率
             }
           
             SCHEDULER_JOB_DEFAULTS = {
                 'coalesce': True,   #積攢的任務只跑一次
                 'max_instances': 1000, #支持1000個實例并發
                'misfire_grace_time':600 #600秒的任務超時容錯
             }
           
             SCHEDULER_API_ENABLED = True

          我本以為這樣應該就沒什么問題了,配置看似完美,但是現實是殘忍的,盯著apscheduler日志看了一會,熟悉的“was missed by”又出現了,這時候就需要懷疑這個配置到底有沒有生效了,然后發現果然沒有生效,從/scheduler/jobs中可以看到任務:

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          15
          16
          17
          18
          19
          20
          21
          22
          23
          {
          "id": "9586_site_status",
          "name": "9586_site_status",
          "func": "monitor_scheduler:monitor_site_status",
          "args": [
          9586,
          "http://sl.jxcn.cn/",
          1000,
          100,
          200,
          "",
          0,
          2
          ],
          "kwargs": {},
          "trigger": "interval",
          "start_date": "2018-09-14T00:00:00+08:00",
          "end_date": "2018-12-31T00:00:00+08:00",
          "minutes": 15,
          "misfire_grace_time": 10,
          "max_instances": 3000,
          "next_run_time": "2018-10-24T18:00:00+08:00"
          }

          可以看到任務中默認就有misfire_grace_time配置,沒有改為600,折騰一會發現修改配置,重啟與修改任務都不會生效,只能修改配置后刪除任務重新添加(才能把這個默認配置用上),或者修改任務的時候把這個值改掉

          1 scheduler.modify_job(func=func, id=id, args=args, trigger=trigger, minutes=minutes,start_date=start_date,end_date=end_date,misfire_grace_time=600)

          然后就可以了?圖樣圖森破,missed 依然存在。

          其實從后來的報錯可以發現這個容錯時間是用上的,因為從執行時間加上600秒后才出現的報錯。

          找到任務超時的根本原因

          那么還是回到這個超時根本問題上,即使容錯時間足夠長,沒有這個報錯了,但是一個任務執行時間過長仍然是個根本問題,所以終極思路還在于如何優化executor的執行時間上。

          當然這里根據不同的任務處理方式是不一樣的,在于各自的代碼了,比如更改鏈接方式、代碼是否有冗余請求,是否可以改為異步執行,等等。

          而我自己的任務解決方式為:由接口請求改為python模塊直接傳參,redis鏈接改為內網,極大提升執行效率,所以也就控制了執行超時問題。

          總結

          以上為個人經驗,希望能給大家一個參考。

          分享到:

          相關信息

          • Python3使用tracemalloc實現追蹤mmap內存變化

            用tracemalloc跟蹤python程序內存占用 用tracemalloc追蹤內存變化 內存占用曲線 mmap內存占用測試 將numpy數組寫入txt文件 numpy文件讀取測試 mmap內存占用測試...

            2023-03-15

          • Python清屏的方法 python如何清屏?

            python如何清屏?你們知道Python怎么清屏嗎,接下來的內容中介紹的是使用這款軟件清除屏幕的方法,歡迎需要的朋友閱讀本文參考下。...

            2023-03-11

          系統教程欄目

          欄目熱門教程

          人氣教程排行

          站長推薦

          熱門系統下載

          玩家必看科普!麻豆人人妻人人妻人人片AV,欧美老妇交乱视频在线观看,久久综合九色综合久99_知乎 人人玩人人添人人澡超碰偷拍 青春娱乐视频精品分类官网2 最好最新高清中文字幕 91国自产拍最新2018 欧美精品一区二区三区不卡网 深夜你懂得我的意思2021 宿舍NP乖把腿张开H 网恋奔现一天被要几次 为什么我越叫他越快 学渣各种各样的PLAY 英语课代表下面好软小说 亚洲国产综合在线区尤物 FREE性丰满HD性欧美 我年轻漂亮的继坶BD 最近中文字幕完整免费视频 啦啦啦免费视频卡一卡二 青柠视频在线观看大全 在线天堂WWW在线资源 亚洲国产日本韩国欧美MV 天天学习|久久久久久久精品国产亚洲87 国产K频道分享系统进入口 三个嘴都吃满了还塞满了 JAPONENSIS老师学生JAVAHBB 亚洲精品1卡2卡3卡4卡 樱花草在线社区WWW韩国 好涨水快流出来了快吃动视频 久久AV无码精品人妻出轨