by:陳澤榮 (timothychenpc@gmail.com)
日期:0221-0222
瘋狂Debug的過程(0221-0222):
一、有些函式庫沒有在requirements.txt中限定特定的版本
二、gunicorn
因為我們通常在使用flask的時候都會直接python3 app.py去運行程式碼,然後在app.py的最後面就會有這一段,用於啟動flask。
if __name__=='__main__': app.run(port=8080,debug=True)
但是當時的我一直不知道為什麼要加上if __ name __==’__main__’:但是後來發現其實是因為通常我們直接使用python腳本的方式運行flask是讓flask運行在測試環境,但是實際上為了安全性等原因實際使用還是得使用生產環境(production environment),而這種uWSGI伺服器的生產環境通常也都是使用gunicorn啟動的,通過gunicorn直接抓取檔案中的伺服器物件進行執行。(所以那個if就是為了防止伺服器重複開啟導致錯誤,因為如果這個程式不是直接在終端機被執行的那__name__就永遠不會等於__main__)
但是呢這個gunicorn真的問題很多。
- 複製工作進程
因為flask下有兩種情況會導致進行被複製
- gunicorn的—worker參數不為1,是會創建多個具有flask_apscheduler的進程(導致任務被複製)→
- 在使用app.run()的時候使用了一個參數debug=True(因為flask在debug的時候會將任務進程複製,最後導致定時性質的任務被重複執行)→可以使用use_reloader=False來解決
三、時區問題
就是這個的flask_apscheduler一定會去抓系統的時間timezone,可是flask伺服器又是直接運行在docker容器裡面,這個時候不管flask的有沒有寫針對scheduler的timezone的設定都直接無效(不要問我怎麼知道的)