摘要:最近公司有項目需要使用到定時任務,其定時邏輯類似于的,就使用了這個類庫。在一次循環結束之前會計算任務下次執行事件與當前時間之差,然后讓調度線程掛起直到那個時間到來。
最近公司有項目需要使用到定時任務,其定時邏輯類似于linux的Cron,就使用了Apscheduler這個類庫。基于公司的業務,需要修改Apshceduler,故而研究了一下Apscheduler的代碼。
Apscheduler的調度邏輯非常簡單,越簡單的東西往往也越有效。
調度器會開辟一個線程,這個線程會循環的從job_store中找到任務,計算任務的執行時間,并與當前時間做比較。如果任務的執行事件<=當前時間,就將任務的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的一個類,當然了,最終的結果是將任務放到線程池當中
if run_times: try: executor.submit_job(job, run_times)
在BaseExecutor類中,有一個abstract method,負責將任務放到線程池當中,在其子類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包中,已經是python3的標準類庫了。
關于調度器的事件循環,如果讓他一直循環不斷的從job_store中取任務,然后判斷,這樣會十分浪費資源。Apscheduler在一次循環結束之前會計算任務下次執行事件與當前時間之差,然后讓調度線程掛起直到那個時間到來。
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)就是讓當前線程等待這么長的一段時間
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/40983.html
介紹 官網文檔:http://apscheduler.readthedoc...API:http://apscheduler.readthedoc... APScheduler是一個python的第三方庫,用來提供python的后臺程序。包含四個組件,分別是: triggers: 任務觸發器組件,提供任務觸發方式 job stores: 任務商店組件,提供任務保存方式 executors: 任務...
摘要:中任務調度一般用中的任務調度工具也有不少等。調度器配置示例方式一方式二三略。移除調用放到,參數為調用實例的方法注意如果任務已經調度完畢,并且之后也不會再被執行的情況下,會被自動移除。可以監聽調度任務執行情況相關的事件。 Java中任務調度一般用Quartz,Python中的任務調度工具也有不少:Celery,RQ,APScheduler等。Celery:非常強大的分布式任務調度框架RQ...
摘要:安裝利用進行安裝源碼安裝有四種組成部分觸發器包含調度邏輯,每一個作業有它自己的觸發器,用于決定接下來哪一個作業會運行。除了他們自己初始配置意外,觸發器完全是無狀態的。 APScheduler簡介 在平常的工作中幾乎有一半的功能模塊都需要定時任務來推動,例如項目中有一個定時統計程序,定時爬出網站的URL程序,定時檢測釣魚網站的程序等等,都涉及到了關于定時任務的問題,第一時間想到的是利用t...
摘要:項目中需要用到定時器和循環執行。運用線程執行輪詢操作,也有運用系統的的文章最多,但是太麻煩。和中間人的消息傳輸支持所有特性,但也提供大量其他實驗性方案的支持,包括用進行本地開發。同時也包含了對任務的控制。后續有需求在繼續。 項目中需要用到定時器和循環執行。去網上搜了一下,比較常見的有一下集中。運用Python線程執行輪詢操作,也有運用Linux系統的Cron,Celery的文章最多,但...
摘要:今天介紹在中使用定時任務的兩種方式。添加并啟動定時任務其它命令顯示當前的定時任務刪除所有定時任務今天的定時任務就說到這里,有錯誤之處,歡迎交流指正 今天介紹在django中使用定時任務的兩種方式。 方式一: APScheduler1)安裝: pip install apscheduler 2)使用: from apscheduler.scheduler import Scheduler...
閱讀 709·2021-11-22 13:54
閱讀 3074·2021-09-26 10:16
閱讀 3499·2021-09-08 09:35
閱讀 1582·2019-08-30 15:55
閱讀 3433·2019-08-30 15:54
閱讀 2081·2019-08-30 10:57
閱讀 500·2019-08-29 16:25
閱讀 880·2019-08-29 16:15