2017-04-24 44 views
0

我有一個在Flask中開發的Web應用程序。設置很簡單。該應用程序正在Gunicorn上運行。所有請求都通過nginx代理。 Flask應用程序本身向外部API發出HTTP請求。從flask應用程序到外部API的HTTP請求由來自前端JavaScript代碼的AJAX調用啓動。外部API以JSON格式將數據返回給Flask應用程序並返回到前端。使用Gunicorn異步工作器運行的應用程序看起來效率低於dev服務器

問題是,當我在開發模式下使用選項multithreaded = True運行此應用程序時,我可以看到JSON數據異步返回到服務器,並且可以非常快速地在前端頁面上看到結果。

但是,當我嘗試使用nginx和gunicorn在生產模式下運行應用程序時,我發現JSON數據按順序返回 - 逐漸退出。看起來由於某種原因,對外部API的HTTP請求被阻止。

我在linux Ubuntu Server 16.04上使用supervisor。這是我開始通過主管gunicorn:

command = /path/to/project/env/bin/gunicorn -k gevent --worker-connections 1000 wsgi:app -b localhost:8500 

看來,gunicorn不會異步處理請求,但它應該。

作爲實驗,我運行Flask應用程序,使用它在開發模式下內置於wsgi服務器(不gunicorn)中,使用debug=Truemultithreaded=True。所有請求仍然通過nginx進行代理。 JSON數據返回更快,即異步(似乎呼叫沒有阻止)。

我讀gunicorn的文檔。它說如果我需要調用外部API,那麼我應該使用異步工作。我使用它們,但它不起作用。

所有的緩存內容都被考慮在內。我可能會認爲我沒有使用任何緩存。我在檢查服務器設置時清除了所有內容。

我錯過了什麼?我如何讓gunicorn按預期運行?

謝謝。

回答

0

我實際上很快解決了這個問題,並忘記馬上發佈答案。爲什麼gunicorn服務器沒有像我期望的那樣異步處理這些請求的原因非常簡單和愚蠢。由於我是通過主管管理gunicorn我改變了配置後:

command = /path/to/project/env/bin/gunicorn -k gevent --worker-connections 1000 wsgi:app -b localhost:8500 

我忘了運行:

sudo supervisorctl reread 
sudo supervisorctl update 

這很簡單,但並不明顯,但。我的錯誤是,我希望我用這個命令來重新啓動我的應用程序上gunicorn後的配置自動更新:

sudo supervisorctl restart my_app 

是它重新啓動應用程序,而不是gunicorn的配置。

相關問題