日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

asp python 定时任务_python定时任务最强框架APScheduler详细教程

發(fā)布時(shí)間:2023/12/19 python 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 asp python 定时任务_python定时任务最强框架APScheduler详细教程 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

APScheduler定時(shí)任務(wù)

上次測試女神聽了我的建議,已經(jīng)做好了要給項(xiàng)目添加定時(shí)任務(wù)的決定了。但是之前提供的四種方式中,她不知道具體選擇哪一個(gè)。為了和女神更近一步,我把我入行近10年收藏的干貨免費(fèi)拿出來分享給女神,希望女神凌晨2點(diǎn)再找我的時(shí)候,不再是因?yàn)橐o他調(diào)程序了。

Python中定時(shí)任務(wù)的解決方案,總體來說有四種,分別是:crontab、 scheduler、 Celery、 APScheduler,其中 crontab不適合多臺(tái)服務(wù)器的配置、scheduler太過于簡單、 Celery依賴的軟件比較多,比較耗資源。最好的解決方案就是 APScheduler。

APScheduler使用起來十分方便。提供了基于日期、固定時(shí)間間隔以及 crontab類型的任務(wù)。還可以在程序運(yùn)行過程中動(dòng)態(tài)的新增任務(wù)和刪除任務(wù)。在任務(wù)運(yùn)行過程中,還可以把任務(wù)存儲(chǔ)起來,下次啟動(dòng)運(yùn)行依然保留之前的狀態(tài)。另外最重要的一個(gè)特點(diǎn)是,因?yàn)樗腔?Python語言的庫,所以是可以跨平臺(tái)的,一段代碼,處處運(yùn)行!

在這里我來給大家詳細(xì)介紹一下具體的用法。

一、安裝:

安裝非常簡單,通過 pip install apscheduler即可。

二、基本使用:

先來看一段代碼,然后再來給大家詳細(xì)講解其中的細(xì)節(jié):

  • 其中 BlockingScheduler是阻塞性的調(diào)度器,是最基本的調(diào)度器,下面調(diào)用 start方法就會(huì)阻塞當(dāng)前進(jìn)程,所以如果你的程序除了調(diào)度進(jìn)程沒有其他后臺(tái)進(jìn)程,那么是可以是否的,否則這個(gè)調(diào)度器會(huì)阻塞你程序的正常執(zhí)行。

    接下來就是定義一個(gè) my_clock函數(shù),這個(gè)函數(shù)就是需要定時(shí)調(diào)度的任務(wù)代碼。

    然后就是實(shí)例化一個(gè) BlockingScheduler對(duì)象,并把 my_clock添加到任務(wù)調(diào)度中。然后看 interval參數(shù),這里用的是間隔的方式來調(diào)度,調(diào)度頻率是 seconds=3,也就是每3秒執(zhí)行一次。

    執(zhí)行結(jié)果如下:

    可以看到每隔3秒鐘的時(shí)間會(huì)執(zhí)行一次。說明定時(shí)任務(wù)已經(jīng)成功執(zhí)行了!

    在了解了 APScheduler的基本使用后,再來對(duì) APScheduler的四個(gè)基本對(duì)象做個(gè)了解,這樣才能從全局掌握 APScheduler。

    三、四個(gè)基本對(duì)象:

    1. 觸發(fā)器(triggers):

    觸發(fā)器就是根據(jù)你指定的觸發(fā)方式,比如是按照時(shí)間間隔,還是按照 crontab觸發(fā),觸發(fā)條件是什么等。每個(gè)任務(wù)都有自己的觸發(fā)器。

    2. 任務(wù)存儲(chǔ)器(job stores):

    任務(wù)存儲(chǔ)器是可以存儲(chǔ)任務(wù)的地方,默認(rèn)情況下任務(wù)保存在內(nèi)存,也可將任務(wù)保存在各種數(shù)據(jù)庫中。任務(wù)存儲(chǔ)進(jìn)去后,會(huì)進(jìn)行序列化,然后也可以反序列化提取出來,繼續(xù)執(zhí)行。

    3. 執(zhí)行器(executors):

    執(zhí)行器的目的是安排任務(wù)到線程池或者進(jìn)程池中運(yùn)行的。

    4. 調(diào)度器(schedulers):

    任務(wù)調(diào)度器是屬于整個(gè)調(diào)度的總指揮官。他會(huì)合理安排作業(yè)存儲(chǔ)器、執(zhí)行器、觸發(fā)器進(jìn)行工作,并進(jìn)行添加和刪除任務(wù)等。調(diào)度器通常是只有一個(gè)的。開發(fā)人員很少直接操作觸發(fā)器、存儲(chǔ)器、執(zhí)行器等。因?yàn)檫@些都由調(diào)度器自動(dòng)來實(shí)現(xiàn)了。

    四、觸發(fā)器:

    觸發(fā)器有兩種,第一種是 interval,第二種是 crontab。interval可以具體指定多少時(shí)間間隔執(zhí)行一次。crontab可以指定執(zhí)行的日期策略。以下分別進(jìn)行講解。

    1. date觸發(fā)器:

    在某個(gè)日期時(shí)間只觸發(fā)一次事件。示例代碼如下:

  • 更多請(qǐng)參考:https://apscheduler.readthedocs.io/en/stable/modules/triggers/date.html

    2. interval觸發(fā)器:

    想要在固定的時(shí)間間隔觸發(fā)事件。interval的觸發(fā)器可以設(shè)置以下的觸發(fā)參數(shù):

  • weeks:周。整形。

  • days:一個(gè)月中的第幾天。整形。

  • hours:小時(shí)。整形。

  • minutes:分鐘。整形。

  • seconds:秒。整形。

  • start_date:間隔觸發(fā)的起始時(shí)間。

  • end_date:間隔觸發(fā)的結(jié)束時(shí)間。

  • jitter:觸發(fā)的時(shí)間誤差。

  • 在每天的11點(diǎn)24分觸發(fā)事件。更多請(qǐng)參考:https://apscheduler.readthedocs.io/en/stable/modules/triggers/interval.html

    3. crontab觸發(fā)器:

    在某個(gè)確切的時(shí)間周期性的觸發(fā)事件。可以使用的參數(shù)如下:

  • year:4位數(shù)字的年份。

  • month:1-12月份。

  • day:1-31日。

  • week:1-53周。

  • day_of_week:一個(gè)禮拜中的第幾天( 0-6或者 mon、 tue、 wed、 thu、 fri、 sat、 sun)。

  • hour: 0-23小時(shí)。

  • minute: 0-59分鐘。

  • second: 0-59秒。

  • start_date: datetime類型或者字符串類型,起始時(shí)間。

  • end_date: datetime類型或者字符串類型,結(jié)束時(shí)間。

  • timezone:時(shí)區(qū)。

  • jitter:任務(wù)觸發(fā)的誤差時(shí)間。

  • 也可以用表達(dá)式類型,可以用以下方式:

    示例如下:

  • 五、調(diào)度器:

  • BlockingScheduler:適用于調(diào)度程序是進(jìn)程中唯一運(yùn)行的進(jìn)程,調(diào)用 start函數(shù)會(huì)阻塞當(dāng)前線程,不能立即返回。

  • BackgroundScheduler:適用于調(diào)度程序在應(yīng)用程序的后臺(tái)運(yùn)行,調(diào)用 start后主線程不會(huì)阻塞。

  • AsyncIOScheduler:適用于使用了 asyncio模塊的應(yīng)用程序。

  • GeventScheduler:適用于使用 gevent模塊的應(yīng)用程序。

  • TwistedScheduler:適用于構(gòu)建 Twisted的應(yīng)用程序。

  • QtScheduler:適用于構(gòu)建 Qt的應(yīng)用程序。

  • 六、任務(wù)存儲(chǔ)器:

    任務(wù)存儲(chǔ)器的選擇有兩種。一是內(nèi)存,也是默認(rèn)的配置。二是數(shù)據(jù)庫。使用內(nèi)存的方式是簡單高效,但是不好的是,一旦程序出現(xiàn)問題,重新運(yùn)行的話,會(huì)把之前已經(jīng)執(zhí)行了的任務(wù)重新執(zhí)行一遍。數(shù)據(jù)庫則可以在程序崩潰后,重新運(yùn)行可以從之前中斷的地方恢復(fù)正常運(yùn)行。有以下幾種選擇:

  • MemoryJobStore:沒有序列化,任務(wù)存儲(chǔ)在內(nèi)存中,增刪改查都是在內(nèi)存中完成。

  • SQLAlchemyJobStore:使用 SQLAlchemy這個(gè) ORM框架作為存儲(chǔ)方式。

  • MongoDBJobStore:使用 mongodb作為存儲(chǔ)器。

  • RedisJobStore:使用 redis作為存儲(chǔ)器。

  • 七、執(zhí)行器:

    執(zhí)行器的選擇取決于應(yīng)用場景。通常默認(rèn)的 ThreadPoolExecutor已經(jīng)在大部分情況下是可以滿足我們需求的。如果我們的任務(wù)涉及到一些 CPU密集計(jì)算的操作。那么應(yīng)該考慮 ProcessPoolExecutor。然后針對(duì)每種程序, apscheduler也設(shè)置了不同的 executor:

  • ThreadPoolExecutor:線程池執(zhí)行器。

  • ProcessPoolExecutor:進(jìn)程池執(zhí)行器。

  • GeventExecutor: Gevent程序執(zhí)行器。

  • TornadoExecutor: Tornado程序執(zhí)行器。

  • TwistedExecutor: Twisted程序執(zhí)行器。

  • AsyncIOExecutor: asyncio程序執(zhí)行器。

  • 八、定時(shí)任務(wù)調(diào)度配置:

    這里我們用一個(gè)例子來說明。比如我想這樣配置

  • 執(zhí)行器:

    • 配置 default執(zhí)行器為 ThreadPoolExecutor,并且設(shè)置最多的線程數(shù)是20個(gè)。

    • <

    存儲(chǔ)器:

    • 配置 default的任務(wù)存儲(chǔ)器為 SQLAlchemyJobStore(使用SQLite)。

    • <

    任務(wù)配置:

    設(shè)置 coalesce為 False:設(shè)置這個(gè)目的是,比如由于某個(gè)原因?qū)е履硞€(gè)任務(wù)積攢了很多次沒有執(zhí)行(比如有一個(gè)任務(wù)是1分鐘跑一次,但是系統(tǒng)原因斷了5分鐘),如果 coalesce=True,那么下次恢復(fù)運(yùn)行的時(shí)候,會(huì)只執(zhí)行一次,而如果設(shè)置 coalesce=False,那么就不會(huì)合并,會(huì)5次全部執(zhí)行。

    max_instances=5:同一個(gè)任務(wù)同一時(shí)間最多只能有5個(gè)實(shí)例在運(yùn)行。比如一個(gè)耗時(shí)10分鐘的job,被指定每分鐘運(yùn)行1次,如果我 max_instance值5,那么在第6~10分鐘上,新的運(yùn)行實(shí)例不會(huì)被執(zhí)行,因?yàn)橐呀?jīng)有5個(gè)實(shí)例在跑了。

    那么代碼如下:

  • 九、任務(wù)操作:

  • 1. 添加任務(wù):

    使用 scheduler.add_job(job_obj,args,id,trigger,**trigger_kwargs)。

    2. 刪除任務(wù):

    使用 scheduler.remove_job(job_id,jobstore=None)。

    3. 暫停任務(wù):

    使用 scheduler.pause_job(job_id,jobstore=None)。

    4. 恢復(fù)任務(wù):

    使用 scheduler.resume_job(job_id,jobstore=None)。

    5. 修改某個(gè)任務(wù)屬性信息:

    使用 scheduler.modify_job(job_id,jobstore=None,**changes)。

    6. 修改單個(gè)作業(yè)的觸發(fā)器并更新下次運(yùn)行時(shí)間:

    使用 scheduler.reschedule_job(job_id,jobstore=None,trigger=None,**trigger_args)

    7. 輸出作業(yè)信息:

    使用 scheduler.print_jobs(jobstore=None,out=sys.stdout)

    十、異常監(jiān)聽:

    當(dāng)我們的任務(wù)拋出異常后,我們可以監(jiān)聽到,然后把錯(cuò)誤信息進(jìn)行記錄。示例代碼如下:

  • from apscheduler.schedulers.blocking import BlockingScheduler

  • from apscheduler.events import EVENT_JOB_EXECUTED, EVENT_JOB_ERROR

  • import datetime

  • import logging

  • # 配置日志顯示

  • 以上便是 APScheduler庫的詳細(xì)用法了。如果我們需要在項(xiàng)目中開一個(gè)定時(shí)功能,完全可以選擇 APScheduler,輕量又功能強(qiáng)大。

    這次女神再也不用2點(diǎn)跑到公司去加班啦~

    總結(jié)

    以上是生活随笔為你收集整理的asp python 定时任务_python定时任务最强框架APScheduler详细教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。