93

ローカルサーバーでFlaskをいじり始めたところですが、リクエスト/レスポンス時間が思ったよりも遅いことに気付きました。

次のような単純なサーバーでは、応答に 5 秒近くかかります。

from flask import Flask

app = Flask(__name__)

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

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

何か案は?それとも、これはローカルサーバーの状態ですか?

4

9 に答える 9

99

わかりました。これは、IPv6 をサポートする Werkzeug および OS の問題のようです。

Werkzeug サイトhttp://werkzeug.pocoo.org/docs/serving/から:

最新の Linux システム、OS X 10.4 以降、および Windows Vista など、ipv6 をサポートし、それが構成されているオペレーティング システムでは、ローカル サーバーにアクセスすると、ブラウザによっては非常に遅くなる場合があります。この理由は、「localhost」が ipv4 と ipv6 ソケットの両方で使用できるように構成されている場合があり、一部のブラウザーは最初に ipv6 にアクセスし、次に ivp4 にアクセスしようとするためです。

したがって、ホスト ファイルから次の行をコメント アウトして、localhost から ipv6 を無効にすることで修正できます。

::1             localhost 

これを行うと、レイテンシの問題はなくなります。

私は本当に Flask を掘り下げており、フレームワークの問題ではないことを嬉しく思います。私はそれがあり得ないことを知っていました。

于 2012-06-22T05:56:06.353 に答える
96

ここで提案されているように、app.run() の引数として「threaded=True」を追加します: http://arusahni.net/blog/2013/10/flask-multithreading.html

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

ipv6 を無効にするソリューションは私にはうまくいきませんでしたが、これはうまくいきました。

于 2015-02-28T00:30:14.347 に答える
14

@sajid-siddiqi の解決策は技術的には正しいですが、 Werkzeugの組み込みWSGIサーバー( Flaskにパッケージ化されており、それが に使用するもの) はシングルスレッドのみであることに注意してください。app.run()

マルチスレッド動作を処理できるようにWSGIサーバーをインストールします。さまざまなWSGIサーバーのパフォーマンスについて、さまざまな調査を行いました。ニーズはさまざまですが、使用しているのがFlaskだけの場合は、次の Web サーバーのいずれかをお勧めします。

更新 (2020-07-25): gevent は 5 年前に python3サポートを開始したようですが、私がサポートしていないとコメントした直後に、geventを使用できるようになりました。

イベント

コマンドを使用してpipを介してgeventをインストールするか、コマンドを使用してpip3をインストールできます。それに応じてコードを変更する方法については、https ://flask.palletsprojects.com/en/1.1.x/deploying/wsgi-standalone/#gevent をご覧ください。pip install geventpip3 install gevent

メインヘルド

geventの方が優れていますが、実世界でのテストに関連して私が調べたすべてのベンチマークから、meinheldは最も単純で単純なWSGIサーバーのようです。(さらに構成を気にしない場合は、 uWSGIを参照することもできます。)

コマンドを使用して、 pip3からmeinheldをインストールすることもできますpip3 install meinheld。そこから、meinheldソースで提供されているサンプルを見て、 Flaskを統合します: https://github.com/mopemope/meinheld/blob/master/example/flask_sample.py

*注: 私のPyCharmの使用から、行from meinheld import serverはエラーとして強調表示されますが、サーバーは実行されるため、エラーは無視できます。

于 2015-04-27T04:39:22.017 に答える
8

私の問題は「threaded = True」によって解決されましたが、私の問題をこれで解決できない他の問題と区別するための背景を説明したいと思います。

  1. 私の問題は、python3 で Flask を実行しているときにのみ発生しました。python2 に切り替えると、この問題はなくなりました。
  2. 私の問題は、Chrome で API にアクセスしたときにのみ現れました。その時点で、Chrome は予期した画面を表示しましたが、Chrome タブをリロードするか閉じるまで他のすべて (curl、ffx など) がハングしました。 around が結果を返しました。

私の推測では、Chrome がセッションを開いたままにしようとしていて、Flask が後続のリクエストをブロックしていたということです。Chrome からの接続が停止またはリセットされるとすぐに、他のすべてが処理されました。

私の場合、スレッド化で修正されました。もちろん、他の人が提供したリンクのいくつかを調べて、他の問題が発生しないことを確認しています.

于 2016-07-01T18:01:52.463 に答える
0

ここで別の解決策がありました。.pycサーバーのディレクトリからすべてを削除して、もう一度開始しました。ところで、私のホスト ファイル (Windows 8) では、localhost は既にコメント アウトされています。

サーバーはずっとフリーズしていましたが、今では正常に動作しています。

于 2014-05-07T05:18:48.173 に答える
0

以外のホストで実行しているときにこのエラーが発生したlocalhostため、いくつかの異なる根本的な問題が同じ症状を示す可能性があります。

今まで使っていたもののほとんどを Tornado に切り替えたところ、かなり役に立ちました。ページの読み込みが遅くなったことがいくつかありましたが、全般的に応答性が向上したようです。また、非常に逸話的ですが、Flask だけでは時間の経過とともに速度が低下することに気付いたようですが、Flask + Tornado ではそれほど遅くはありません。私は Apache を使用mod_wsgiするとさらに良くなると思いますが、Tornado のセットアップは非常に簡単です ( http://flask.pocoo.org/docs/deploying/others/を参照)。

(また、関連する質問: Flask アプリが時々ハングする)

于 2012-12-28T01:54:03.313 に答える