成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Python Apscheduler源代碼解析(一) 任務(wù)調(diào)度流程

chavesgu / 1363人閱讀

摘要:最近公司有項目需要使用到定時任務(wù),其定時邏輯類似于的,就使用了這個類庫。在一次循環(huán)結(jié)束之前會計算任務(wù)下次執(zhí)行事件與當(dāng)前時間之差,然后讓調(diào)度線程掛起直到那個時間到來。

最近公司有項目需要使用到定時任務(wù),其定時邏輯類似于linux的Cron,就使用了Apscheduler這個類庫。基于公司的業(yè)務(wù),需要修改Apshceduler,故而研究了一下Apscheduler的代碼。

Apscheduler的調(diào)度邏輯非常簡單,越簡單的東西往往也越有效。

調(diào)度器會開辟一個線程,這個線程會循環(huán)的從job_store中找到任務(wù),計算任務(wù)的執(zhí)行時間,并與當(dāng)前時間做比較。如果任務(wù)的執(zhí)行事件<=當(dāng)前時間,就將任務(wù)的firetime放到一個列表中(runtimes)

    def _get_run_times(self, now):
        run_times = []
        next_run_time = self.next_run_time
        while next_run_time and next_run_time <= now:
            run_times.append(next_run_time)
            next_run_time = self.trigger.get_next_fire_time(next_run_time, now)

        return run_times

如果runtimes不為空,就將其放入Executor中,下面代碼中的executor不是Python的線程池類,是Apscheduler的一個類,當(dāng)然了,最終的結(jié)果是將任務(wù)放到線程池當(dāng)中

                if run_times:
                    try:
                        executor.submit_job(job, run_times)

在BaseExecutor類中,有一個abstract method,負責(zé)將任務(wù)放到線程池當(dāng)中,在其子類BasePoolExecutor中,繼承了這個方法

    def _do_submit_job(self, job, run_times):
        def callback(f):
            exc, tb = (f.exception_info() if hasattr(f, "exception_info") else
                       (f.exception(), getattr(f.exception(), "__traceback__", None)))
            if exc:
                self._run_job_error(job.id, exc, tb)
            else:
                self._run_job_success(job.id, f.result())

        f = self._pool.submit(run_job, job, job._jobstore_alias, run_times, self._logger.name)
        f.add_done_callback(callback)

代碼中的self._pool可以是線程池,也可以是進程池,在concurrent.futures包中,已經(jīng)是python3的標(biāo)準(zhǔn)類庫了。

關(guān)于調(diào)度器的事件循環(huán),如果讓他一直循環(huán)不斷的從job_store中取任務(wù),然后判斷,這樣會十分浪費資源。Apscheduler在一次循環(huán)結(jié)束之前會計算任務(wù)下次執(zhí)行事件與當(dāng)前時間之差,然后讓調(diào)度線程掛起直到那個時間到來。

    def _main_loop(self):
        wait_seconds = TIMEOUT_MAX
        while self.state != STATE_STOPPED:
            self._event.wait(wait_seconds)
            self._event.clear()
            wait_seconds = self._process_jobs()

self._process_jobs()的返回值就是上面說的那個時間,self._event.wait(wait_seconds)就是讓當(dāng)前線程等待這么長的一段時間

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/40983.html

相關(guān)文章

  • Python任務(wù)調(diào)度模塊APScheduler

    介紹 官網(wǎng)文檔:http://apscheduler.readthedoc...API:http://apscheduler.readthedoc... APScheduler是一個python的第三方庫,用來提供python的后臺程序。包含四個組件,分別是: triggers: 任務(wù)觸發(fā)器組件,提供任務(wù)觸發(fā)方式 job stores: 任務(wù)商店組件,提供任務(wù)保存方式 executors: 任務(wù)...

    zxhaaa 評論0 收藏0
  • APScheduler任務(wù)調(diào)度利器

    摘要:中任務(wù)調(diào)度一般用中的任務(wù)調(diào)度工具也有不少等。調(diào)度器配置示例方式一方式二三略。移除調(diào)用放到,參數(shù)為調(diào)用實例的方法注意如果任務(wù)已經(jīng)調(diào)度完畢,并且之后也不會再被執(zhí)行的情況下,會被自動移除??梢员O(jiān)聽調(diào)度任務(wù)執(zhí)行情況相關(guān)的事件。 Java中任務(wù)調(diào)度一般用Quartz,Python中的任務(wù)調(diào)度工具也有不少:Celery,RQ,APScheduler等。Celery:非常強大的分布式任務(wù)調(diào)度框架RQ...

    Flink_China 評論0 收藏0
  • 定時任務(wù)框架APScheduler學(xué)習(xí)詳解

    摘要:安裝利用進行安裝源碼安裝有四種組成部分觸發(fā)器包含調(diào)度邏輯,每一個作業(yè)有它自己的觸發(fā)器,用于決定接下來哪一個作業(yè)會運行。除了他們自己初始配置意外,觸發(fā)器完全是無狀態(tài)的。 APScheduler簡介 在平常的工作中幾乎有一半的功能模塊都需要定時任務(wù)來推動,例如項目中有一個定時統(tǒng)計程序,定時爬出網(wǎng)站的URL程序,定時檢測釣魚網(wǎng)站的程序等等,都涉及到了關(guān)于定時任務(wù)的問題,第一時間想到的是利用t...

    sewerganger 評論0 收藏0
  • Flask-APScheduler使用教程

    摘要:項目中需要用到定時器和循環(huán)執(zhí)行。運用線程執(zhí)行輪詢操作,也有運用系統(tǒng)的的文章最多,但是太麻煩。和中間人的消息傳輸支持所有特性,但也提供大量其他實驗性方案的支持,包括用進行本地開發(fā)。同時也包含了對任務(wù)的控制。后續(xù)有需求在繼續(xù)。 項目中需要用到定時器和循環(huán)執(zhí)行。去網(wǎng)上搜了一下,比較常見的有一下集中。運用Python線程執(zhí)行輪詢操作,也有運用Linux系統(tǒng)的Cron,Celery的文章最多,但...

    Noodles 評論0 收藏0
  • django開發(fā)-定時任務(wù)的使用

    摘要:今天介紹在中使用定時任務(wù)的兩種方式。添加并啟動定時任務(wù)其它命令顯示當(dāng)前的定時任務(wù)刪除所有定時任務(wù)今天的定時任務(wù)就說到這里,有錯誤之處,歡迎交流指正 今天介紹在django中使用定時任務(wù)的兩種方式。 方式一: APScheduler1)安裝: pip install apscheduler 2)使用: from apscheduler.scheduler import Scheduler...

    wean 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<