Gunicorn+Flask中重複啓動後臺線程問題

假設程序以下: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的子進程重複執行,有三種方式。app

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

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

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

   以上經過奇怪的操做啓動後臺線程。但不推薦。能夠考慮使用celery或者cron等方式實現需求。debug

相關文章
相關標籤/搜索