2017-12-12 20 views
1

私はそうのように定義されたシンプルなフラスコサーバーを持っている:python-requestがlocalhostに遅いのはなぜですか?

import sys 

import flask 
from flask import request 

app = flask.Flask(__name__) 
port = 4057 

@app.route('/search', methods=['POST']) 
def search(): 
    request.json['query'] 
    results = ['fake', 'data'] 
    return flask.jsonify(results) 

if __name__ == '__main__': 
app.config['TEMPLATES_AUTO_RELOAD'] = True 
app.run(host='0.0.0.0', port=port, debug=(port != 80)) 

私はこのように定義されたシンプルなクライアントがあります。

import json 

import requests 

headers = {'content-type': 'application/json'} 
resp = requests.post('http://localhost:4057/search', json.dumps({'query': 'foo'}), headers=headers) 
print resp.content 

をクライアントが動作しますが、それは要求を完了するために3秒のようになります。

カールが半秒のようで完了します。

curl 'http://localhost:4057/search' -H 'Content-Type: application/json' -d '{"query": "foo"}'

+0

'app.run()'のフラスコサーバを 'threaded = True'に変更すると、時間がかかりますか? –

+0

どのように時間がかかるのですか、Pythonの実装は何ですか?ほとんどの場合、 'import requests'とPythonの起動に費やされていると思います。 –

+0

@FranciscoCouzo良い推測ですが、 'import requests'と' print "foo" 'it <<5秒です。 –

答えて

2

は、おそらくいくつかの奇妙な名前解決ルールが要求を手探りあり127.0.0.1を試してみてください。

ああ、これは私の仕事用機械です。私は、/ etc/hostsファイルを見ていたし、私はそこにはコメントで言及したよう

た実現しなかったことを定義した〜200本のルートを見て、これは奇妙な行動がcurlを使用して複製については説明しません。

+1

ああ、これは私の仕事のマシンです。私は '/ etc/hosts'を見て、私が気付いていないと定義した〜200の経路を見ました。 –

+3

私はこの答えが本質的に問題を解決するとは思わない。この質問は興味深いので、私は幅広い検索をしました。考えられる理由があります。現代のOSは通常ipv6とipv4の両方をサポートしているので、 'localhost'は最初にipv6アドレスに解決されますが、デフォルトのタイムアウトウィンドウ(通常は1秒)で失敗し、次にipv4アドレスにフォールバックします。カールがうまくいくのは奇妙で、おそらくipv4が当たりますか?または、この理由も重要なポイントではありません。 – Sraw

関連する問題