2012-06-22 41 views
58

剛開始使用本地服務器上的瓶時,我注意到請求/響應時間比我感覺他們應該慢。本地瓶服務器上的緩慢請求

就像下面這樣一個簡單的服務器需要接近5秒來響應。

from flask import Flask 

app = Flask(__name__) 

@app.route("/") 
def index(): 
    return "index" 

if __name__ == "__main__": 
    app.run() 

任何想法?或者這是本地服務器的方式嗎?

+0

它不是本地服務器,但它可能與其他在後臺運行的應用程序有什麼關係? – gabeio

+0

我在i7上運行OS X 10.7 iMac – Meroon

+1

它不應該花這麼長時間才能響應,但實際上我已經搞亂了瓶子,沒有成功我會建議[Bottlepy](http://bottlepy.org /)。雖然仍然檢查你的後臺進程,你可能會在後臺運行一箇舊版本的服務器,接管你的python並導致你的響應速度緩慢。另外它可能是你的瀏覽器這是否發生在鉻和Safari瀏覽器? – gabeio

回答

70

好吧,我想通了。這似乎與Werkzeug和os支持ipv6有關。

從WERKZEUG網站http://werkzeug.pocoo.org/docs/serving/

在支持IPv6和相應的配置,如現代的Linux系統,OS X 10.4或更高版本以及Windows Vista中的某些瀏覽器可如果訪問非常緩慢的操作系統你的本地服務器。原因是有時候「localhost」被配置爲在ipv4和ipv6 socktes上可用,並且一些瀏覽器將嘗試首先訪問ipv6,然後嘗試訪問ivp4。

所以解決方法是從我的hosts文件中註釋掉以下行從本地主機禁用IPv6:

::1    localhost 

一旦我做到這一點的延遲問題消失。

我真的在挖Flask,我很高興它不是框架問題。我知道這不可能。

+1

我發現這些有用的: 的Windows http://www.techunboxed.com/2012/08/how-to-disable-ipv6-in-windows-8.html Ubuntu的 HTTP://www.noobslab。 com/2012/05/disable-ipv6-if-your-internet-is.html –

+0

非常感謝!突然開發測試很快,反應敏捷!我唯一的問題:作爲Mac主機文件表明,刪除本地主機可能會影響我的Mac的操作,我不知道它是否指的是這條線(或簡單地定位本地主機到127.0.0.1 –

0

我在localhost以外的主機上運行時出現此錯誤,因此對於某些不同的基礎問題可能會出現相同的症狀。

我把我一直使用的大部分東西都轉換到了Tornado上,而且有趣的是它有一定的幫助。我有一些緩慢的頁面加載,但事情似乎通常更敏感。此外,非常軼事,但我似乎注意到單獨的瓶子會隨着時間的推移而放慢速度,但Flask + Tornado更不如此。我想用Apache和mod_wsgi會讓事情變得更好,但Tornado的設置非常簡單(請參閱http://flask.pocoo.org/docs/deploying/others/)。

(同樣,一個相關的問題:Flask app occasionally hanging

0

我這裏有不同的解決方案。我剛剛從服務器的目錄中刪除了所有.pyc並重新啓動它。 順便說一句,localhost已經在我的主機文件(Windows 8)中註釋掉了。

服務器一直凍結,現在它再次正常工作。

55

添加 「線程=真」 作爲參數傳遞給app.run(),因爲這裏建議: http://arusahni.net/blog/2013/10/flask-multithreading.html

例如:app.run(host="0.0.0.0", port=8080, threaded=True)

IPv6的禁用的解決方案並沒有爲我工作,但這樣做了。

+4

傳遞' - 線程'使用'Flask-Script'也可以實現manage.py' – Snorfalorpagus

+4

對於那些通過啓用線程來「固定」的應用程序,請注意!在這種情況下,延遲是由於前一個請求未被正確關閉引起的,所以現在它實際上[只是堆積了很多線程](http://i.stack.imgur.com/lRUpS.png)。 – cvsguimaraes

+0

謝謝先生讓我的本地主機運行得非常快。 – benjaminz

6

溶液由@ sajid-siddiqi在技術上是正確的,但請記住,內置WSGI服務器WERKZEUG(被包裝成什麼它使用app.run())。

安裝WSGI服務器能夠處理多線程行爲。我做了一堆關於各種WSGI服務器性能的研究。您的需求可能會有所不同,但如果您正在使用的是燒瓶,那麼我會推薦以下網絡服務器之一。

對於Python 2.x的:GEVENT

您可以通過PIP用命令pip install gevent安裝GEVENT。關於如何修改代碼指令相應的位置:http://flask.pocoo.org/docs/0.10/deploying/wsgi-standalone/#gevent

對於Python 3.x的:meinheld

GEVENT是更好的,但它仍然沒有被更新爲使用python3(見這個線程的更新:https://github.com/gevent/gevent/issues/38)。從我看過的所有涉及真實世界測試的基準測試中,meinheld似乎是最直接,最簡單的WSGI服務器。 (你也可以看看uWSGI,如果你不介意的一些配置。)

您也可以通過PIP3用命令pip3 install meinheld安裝meinheld。從那裏,看在meinheld源所提供的樣品進行整合https://github.com/mopemope/meinheld/blob/master/example/flask_sample.py

*注意:從我使用的PyCharm,行from meinheld import server亮點爲錯誤,但服務器將運行,所以你可以忽略這個錯誤。

+0

我有很大的性能與Flask有關的問題,即使是最簡單的請求也需要大約0.5秒才能完成。只需切換到gevent,一切都完美無瑕,謝謝! – gronostaj

3

我不太有評論的聲望,所以我會將其添加爲「解決方案」。 我的問題是通過「threaded = True」解決的,但我想給出一些背景來區分我的問題與其他人可能不會這樣做的問題。

  1. 我的問題只出現在與python3運行Flask時。切換到python2,我不再有這個問題。
  2. 我的問題表現爲只有當用Chrome訪問api時,此時Chrome顯示了預期的屏幕,但其他所有內容都被掛起(捲曲,ffx等),直到我重新加載或關閉了Chrome標籤,此時一切等待的東西都會返回結果。

我最好的猜測是Chrome試圖保持會話打開,Flask阻止了後續的請求。只要Chrome的連接被停止或重置,其他所有事情都會被處理。

在我的案例中,線程修復了它。當然,我現在正在通過其他人提供的一些鏈接來確保它不會導致任何其他問題。

0

threaded=True適合我,但最後我發現這個問題是由於Firefox上的foxyproxy造成的。當燒瓶應用程序是在本地主機上運行,​​因爲如果

  • foxyproxy是在Firefox上啓用響應速度慢發生

如果

  • foxyproxy是在Firefox禁用不會發生反應慢

  • 使用其他瀏覽器訪問網站

我發現唯一的解決方案是禁用foxyproxy,試圖將localhost添加到代理黑名單和調整設置,但他們都沒有工作。