在django-xadmin中APScheduler的啟動(dòng)初始化實(shí)例
環(huán)境: python3.5.x + django1.9.x + xadmin-for-python3
APScheduler做為一個(gè)輕量級(jí)和使用量很多的后臺(tái)任務(wù)計(jì)劃(scheduler)包,可以方便的隨系統(tǒng)啟動(dòng)/關(guān)閉而啟動(dòng)/關(guān)閉,如果整合到django中,啟動(dòng)APScheduler的代碼該寫(xiě)在哪里好呢,
以下幾個(gè)方式供參考:
1. (推薦)自定義Middleware,非常類似Java中的Filter,缺點(diǎn)是要有URL訪問(wèn)才會(huì)觸發(fā)啟動(dòng),如果系統(tǒng)還沒(méi)有啟動(dòng)完就訪問(wèn)了URL會(huì)觸發(fā)__init__多次調(diào)用(多次http同時(shí)請(qǐng)求造成),可以通過(guò)threading的lock同步代碼和狀態(tài)限制執(zhí)行一次
class StartupMiddleware(object): def __init__(self): #啟動(dòng)后臺(tái)任務(wù)APScheduler init_scheduler() from django.core.exceptions import MiddlewareNotUsed raise MiddlewareNotUsed #TIP 拋出此異常,則Django將從 middleware 棧中移出該 middleware,請(qǐng)求就不會(huì)經(jīng)過(guò)此middleware def process_request(self, request): print("*****enter startup middleware")
scheduler = None def init_scheduler(): global scheduler lock = threading.Lock() # TIP 多線程同步代碼 with lock: if scheduler and scheduler.running: print('*****APScheduler is already started, pid:{}, tid:{}'.format(os.getpid(), threading.current_thread().getName())) return scheduler executors = { 'default': ThreadPoolExecutor(5),#線程模式下進(jìn)程池大小 'processpool': ProcessPoolExecutor(5),#進(jìn)程模式下進(jìn)程池大小 } job_defaults = { 'coalesce': True, #如果有幾次未執(zhí)行,條件可以時(shí)是否只執(zhí)行一次 'max_instances': 1, #同一個(gè)job同一時(shí)間最多有幾個(gè)實(shí)例再跑 } scheduler = BackgroundScheduler(executors=executors, job_defaults=job_defaults, timezone=timezone(TIME_ZONE)) scheduler.add_job(...) scheduler.start() return scheduler
2. 應(yīng)用中的settings.py文件,django在開(kāi)發(fā)環(huán)境默認(rèn)會(huì)啟動(dòng)兩個(gè)python進(jìn)程(對(duì)于開(kāi)發(fā)環(huán)境還是很實(shí)用的,改代碼后會(huì)自動(dòng)重啟),放settings.py中的代碼會(huì)被這兩個(gè)python進(jìn)程都調(diào)用一次,當(dāng)然可以通過(guò)--reload參數(shù)只啟動(dòng)一個(gè)python進(jìn)程,另外加載settings.py時(shí)部分app還未loaded,限制了應(yīng)用的代碼。
3. 頂層的urls文件, 這個(gè)不管你django啟動(dòng)時(shí)是一個(gè)進(jìn)程還是兩個(gè)進(jìn)程,urls文件也只會(huì)被加載一次,但存在的缺陷就是在執(zhí)行makemigrations這樣的命令時(shí),會(huì)同樣出現(xiàn)app還未loaded的錯(cuò)...
以上這篇在django-xadmin中APScheduler的啟動(dòng)初始化實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python matlab庫(kù)簡(jiǎn)單用法講解
在本篇文章里小編給大家整理了一篇關(guān)于python matlab庫(kù)簡(jiǎn)單用法講解內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。2020-12-12Python爬取騰訊疫情實(shí)時(shí)數(shù)據(jù)并存儲(chǔ)到mysql數(shù)據(jù)庫(kù)的示例代碼
這篇文章主要介紹了Python爬取騰訊疫情實(shí)時(shí)數(shù)據(jù)并存儲(chǔ)到mysql數(shù)據(jù)庫(kù)的示例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03Pandas把dataframe或series轉(zhuǎn)換成list的方法
這篇文章主要介紹了Pandas把dataframe或series轉(zhuǎn)換成list的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06攻擊者是如何將PHP Phar包偽裝成圖像以繞過(guò)文件類型檢測(cè)的(推薦)
這篇文章主要介紹了攻擊者是如何將PHP Phar包偽裝成圖像以繞過(guò)文件類型檢測(cè)的,需要的朋友可以參考下2018-10-10Python使用pywebview開(kāi)發(fā)桌面應(yīng)用的全過(guò)程
當(dāng)使用桌面應(yīng)用程序的時(shí)候,有沒(méi)有那么一瞬間,想學(xué)習(xí)一下桌面應(yīng)用程序開(kāi)發(fā)?下面這篇文章主要給大家介紹了關(guān)于Python使用pywebview開(kāi)發(fā)桌面應(yīng)用的相關(guān)資料,需要的朋友可以參考下2022-06-06python中的數(shù)據(jù)結(jié)構(gòu)比較
這篇文章主要介紹了python中的數(shù)據(jù)結(jié)構(gòu)比較,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-05-05用Python字符畫(huà)出了一個(gè)谷愛(ài)凌
之前經(jīng)常在網(wǎng)上看到那種由一個(gè)個(gè)字符構(gòu)成的視頻,非常炫酷。本文也將利用Python字符畫(huà)一個(gè)最近的冬奧冠軍谷愛(ài)凌,感興趣的小伙伴可以學(xué)習(xí)一下2022-02-02Python-typing: 類型標(biāo)注與支持 Any類型詳解
這篇文章主要介紹了Python-typing: 類型標(biāo)注與支持 Any類型詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-05-05