假設程序以下: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