ローカルFlaskサーバーでの遅いリクエスト


87

ローカルサーバーでFlaskをいじり始めたところ、要求/応答時間が思ったよりもはるかに遅いことに気づきました。

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

from flask import Flask

app = Flask(__name__)

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

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

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


ローカルサーバーではありませんが、バックグラウンドで実行されている他のアプリケーションと関係がある可能性があります。これを実行しているOSは何ですか。
gabeio 2012年

私は
i7iMacのOSX

1
あなたの応答にこれほど長くはかからないはずですが、私は実際にフラスコをいじって成功しなかったので、Bottlepyにアドバイスします。それでもバックグラウンドプロセスを確認しますが、古いバージョンのサーバーがバックグラウンドで実行されている可能性があり、Pythonを引き継いで、応答が遅くなります。また、これはChromeとSafariで発生しますか?
gabeio 2012年

2
@Meroonの答えは私にとって正しかった。ただし、ホスト設定を変更するのではなく、ローカルホストの代わりに127.0.0.1を使用することをお勧めしますか?これにより、システム構成を変更せずに問題が解決しました。
DavidBernat19年

回答:


94

わかりました。これは、ipv6をサポートするWerkzeugとosの問題のようです。

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

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

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

::1             localhost 

これを実行すると、遅延の問題はなくなります。

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



どうもありがとう!突然、開発テストは迅速で応答性が高くなりました。私の唯一の質問:Macホストファイルはローカルホストの削除が私のMacの操作に影響を与える可能性があることを示しているので、それがこの行(または単にローカルホストを127.0.0.1に配置する行)を参照しているかどうか疑問に思います
David B.

ホストファイルのWindows10システムでは、両方のエントリ(ip4とip6)がコメント化されています。それらはDNSシステムによって解決されます。「localhost」ではなく「127.0.0.1」でサーバーを実行すると、速度が大幅に向上しました(単純な呼び出しの場合は2.0秒から0.003秒)
Lars

この答えをありがとう!私の状況は少し異なりましたが(aiosmtpdに対してnose2を実行)、あなたの答えは私にヒントを与えました:Windows 10ラップトップでIPv6無効すると、10倍または100倍の速度になります!!
pepoluan

91

ここで提案されているように、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-disablingソリューションは私には機能しませんでしたが、これは機能しました。


5
--threaded私のmanage.py使用に渡すことFlask-Scriptもうまくいきました。
Snorfalorpagus 2015

7
スレッドを有効にすることで「修正」された場合は、注意してください。この場合、遅延は前のリクエストが適切に閉じられなかったことが原因でした。したがって、現在は実際には多くのスレッドをスタックしているだけです。
kbtz 2015年

1
私のローカルホストを非常に高速に実行させてくれてありがとうございます。
ベンジャミンズ2016年

@snolflake:リクエストが適切に閉じられていないかどうかを知る方法はありますか?
キロタン2017年

1
私が使用したコマンドラインから、flask run --with-threads問題を解決しました。
arno_v

13

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

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

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

gevent

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

meinheld

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がエラーとして強調表示されますが、サーバーは実行されるため、エラーは無視してかまいません。


Flaskで大きなパフォーマンスの問題が発生しました。最も単純なリクエストでも、完了するまでに約0.5秒かかりました。geventに切り替えるだけで、すべてが問題なく機能します。ありがとうございます。
gronostaj 2015年

7

http://localhost:port/endpointcallを呼び出す代わりにhttp://127.0.0.1:port/endpoint。これにより、最初の500ミリ秒の遅延がなくなりました。


私にとっては、3秒のようなものを削除しました(0.0.0.0から127.0.0.1に移動しました)。誰かがそれがなぜそしてどのように機能するのか説明できますか?
Rotkiv

なぜ神の名においてこれが機能するのですか?2.06秒から0.002秒になりました。ブラウザは問題なくローカルホストを使用できますが、ローカルホスト上のrequests.getは解決するのに2秒かかります。
Xevion

7

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

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

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

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


4

threaded=True私にとってはうまくいきますが、最終的に問題はFirefoxのfoxyproxyが原因であることがわかりました。フラスコアプリがローカルホストで実行されている場合、応答が遅くなるのは

  • foxyproxyはFirefoxで有効になっています

遅い応答は起こりません

  • foxyproxyはFirefoxで無効になっています

  • 他のブラウザを使用してWebサイトにアクセスする

私が見つけた唯一の解決策は、foxyproxyを無効にし、ローカルホストをプロキシブラックリストに追加して設定を微調整しようとしたが、どれも機能しなかった。


2

私はミヘコの回答を使って問題を解決しました。

::1 localhostすでにhostsファイルにコメントアウトされていて、設定Threaded=trueが機能しませんでした。すべてのRESTリクエストは、瞬時ではなく処理に1秒かかりました。

私はpython3.6を使用していますが、flaskにgeventをWSGIとして使用させることで、flaskを高速にしてRESTリクエストに応答できるようにしました。

geventを使用するには、 pip install gevent

その後、https: //gist.github.com/viksit/b6733fe1afdf5bb84a40#file-async_flask-py-L41を使用して、geventを使用するようにフラスコを設定しました。

リンクがダウンした場合のスクリプトの重要な部分は次のとおりです。

from flask import Flask, Response
from gevent.pywsgi import WSGIServer
from gevent import monkey

# need to patch sockets to make requests async
# you may also need to call this before importing other packages that setup ssl
monkey.patch_all()

app = Flask(__name__) 


# define some REST endpoints... 

def main():

    # use gevent WSGI server instead of the Flask
    # instead of 5000, you can define whatever port you want.
    http = WSGIServer(('', 5000), app.wsgi_app) 

    # Serve your application
    http.serve_forever()


if __name__ == '__main__':
    main()

threaded = Trueは(python 3.6.7とpostmanを使用して)機能していません。VersionConflict:(greenlet 0.4.13(c:\ anaconda3 \ lib \ site-packages)、Requirement.parse( 'greenlet> = 0.4)を取得しています。 14; platform_python_implementation == "CPythonの" '))、私はおかげで、これを解決する方法を知っているかもしれない
hanzgs

0

それ以外のホストで実行しているときにもこのエラーが発生したlocalhostため、根本的な問題によっては同じ症状が現れる場合があります。

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

(また、関連する質問:Flaskアプリがときどきハングします


0

ここで別の解決策がありました。.pycサーバーのディレクトリからすべてを削除して、再起動しました。ちなみに、localhostは私のhostsファイル(Windows 8)ですでにコメントアウトされています。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.