Gunicorn+Flask中重啟啟動後臺執行緒問題
阿新 • • 發佈:2018-12-20
假設程式如下:
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等方式實現需求。