1. 程式人生 > >Gunicorn+Flask中重啟啟動後臺執行緒問題

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等方式實現需求。