内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

基于多進程中APScheduler重復運行怎么辦-創(chuàng)新互聯

這篇文章主要介紹基于多進程中APScheduler重復運行怎么辦,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

成都創(chuàng)新互聯公司主營那曲網站建設的網絡公司,主營網站建設方案,成都App定制開發(fā),那曲h5重慶小程序開發(fā)搭建,那曲網站營銷推廣歡迎那曲等地區(qū)企業(yè)咨詢

問題

在一個python web應用中需要定時執(zhí)行一些任務,所以用了APScheduler這個庫。又因為是用flask這個web框架,所以用了flask-apscheduler這個插件(本質上與直接用APScheduler一樣,這里不作區(qū)分)。

在開發(fā)中直接測試運行是沒有問題的,但是用gunicorn部署以后發(fā)生了重復運行的問題:

每個任務在時間到的時刻會同時執(zhí)行好幾遍。

注意了一下重復的數量,恰恰是gunicorn里配置的worker進程數量,顯然是每個worker進程都啟動了一份scheduler造成。

解決

可以想到的方案有幾個:

用--preload啟動gunicorn,確保scheduler只在loader的時候創(chuàng)建一次

另外創(chuàng)建一個單獨的定時任務項目,單獨以一個進程運行

用全局鎖確保scheduler只運行一次

經過實踐,只有第三個方案比較好。

preload的問題:

雖然這樣可以使用scheduler創(chuàng)建代碼只執(zhí)行一次,但是問題也在于它只執(zhí)行一次,重新部署以后如果用kill -HUP重啟gunicorn,它并不會重啟,甚至整個項目都不會更新。這是preload的副作用,除非重寫部署腳本,完全重啟應用。

單獨進程的問題:

也是因為部署麻煩,需要多一套部署方案,雖然用Docker會比較方便,但仍然不喜歡,而且同時維護兩個項目也多出很多不必要的事情。

全局鎖是一個較好的方案,但問題在于找一個合適的鎖。

python自帶的多進程多線程鎖方案都需要一個共享變量來維護,但是因為worker進程是被gunicorn的主進程啟動的,并不方便自己維護,所以需要一個系統(tǒng)級的鎖。

在Stackoverflow上看到有人是用了一個socket端口來做鎖實現這個方案,但是我也不喜歡這樣浪費一個寶貴的端口資源。不過這倒給了我一個啟發(fā):

可以用文件鎖!

于是有了這個解決方案:

import atexit
import fcntl
from flask_apscheduler import APScheduler

def init(app):
 f = open("scheduler.lock", "wb")
 try:
  fcntl.flock(f, fcntl.LOCK_EX | fcntl.LOCK_NB)
  scheduler = APScheduler()
  scheduler.init_app(app)
  scheduler.start()
 except:
  pass
 def unlock():
  fcntl.flock(f, fcntl.LOCK_UN)
  f.close()
 atexit.register(unlock)

原理

init函數為flask項目初始化所調用,這里為scheduler模塊的初始化部分。

首先打開(或創(chuàng)建)一個scheduler.lock文件,并加上非阻塞互斥鎖。成功后創(chuàng)建scheduler并啟動。

如果加文件鎖失敗,說明scheduler已經創(chuàng)建,就略過創(chuàng)建scheduler的部分。

最后注冊一個退出事件,如果這個flask項目退出,則解鎖并關閉scheduler.lock文件的鎖。

以上是“基于多進程中APScheduler重復運行怎么辦”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注創(chuàng)新互聯成都網站設計公司行業(yè)資訊頻道!

另外有需要云服務器可以了解下創(chuàng)新互聯scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

網頁題目:基于多進程中APScheduler重復運行怎么辦-創(chuàng)新互聯
瀏覽路徑:http://www.rwnh.cn/article38/hdcsp.html

成都網站建設公司_創(chuàng)新互聯,為您提供響應式網站微信公眾號、云服務器品牌網站制作、網站維護、網站設計公司

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯

成都app開發(fā)公司
湘潭市| 藁城市| 和顺县| 北川| 驻马店市| 梁山县| 井陉县| 偃师市| 娱乐| 宁阳县| 大石桥市| 凌源市| 麦盖提县| 扬中市| 云安县| 新兴县| 永安市| 台北市| 黎川县| 南靖县| 尚义县| 怀化市| 和平县| 成安县| 舒城县| 荥经县| 交城县| 开阳县| 宜宾市| 霞浦县| 沽源县| 防城港市| 兴山县| 德安县| 泗水县| 万载县| 德令哈市| 宝坻区| 垦利县| 夏津县| 平度市|