Gunicorn+Flask中重復啟動后台線程問題


假設程序如下:

1 if __name__ == '__main__':
2     t = Thread(target=test)
3     t.start()
4     app.run(host='0.0.0.0',port=8080,debug=False)

    gunicorn在啟動過程只會從flask的app文件中取出app使用,並不會執行main函數,如果希望在gunicorn中仍舊能啟動后台線程並保證后台線程不因為gunicorn的子進程重復執行,有三種方式。

1.  使用gunicorn的preload參數。在worker進程被復制(派生)之前載入應用的代碼。這種方式,線程執行代碼需要寫在app文件的全局部分,利用預加載只執行一下。

2. 使用flask的app的鈎子函數before_first_request。在before_first_request中執行線程。但這種方式必須要有第一個請求才能觸發線程啟動。

3. 使用文件鎖。這種方式與第一種方式相同,需要把線程執行的代碼寫在app文件的全局部分。在第一個子進程啟動時創建文件並加鎖,在后續的子進程啟動時判斷鎖的狀態,如果有鎖則不執行。

   以上通過奇怪的操作啟動后台線程。但不推薦。可以考慮使用celery或者cron等方式實現需求。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM