为什么python-Requests对Local-Host速度慢



我有一个像这样的简单烧瓶服务器:

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"}'

尝试127.0.0.1可能会有一些奇怪的名称分辨率规则摸索请求。

啊,这是我的工作机器。我看了/etc/主机,看到了约200条路线,我没有意识到在那里

正如评论中提到的那样,这不能解释使用curl复制的奇数行为。

我最近遇到了从请求到'localhost'的慢速连接的类似问题,还发现使用'127.0.0.1.1'速度更快。

进行了一些调查后,我发现在我的情况下,窗口上的慢速连接与尝试IPv6连接的Urllib3(请求使用的传输库)有关,因为服务器仅在IPv4上侦听,因此被拒绝。但是,仅对于Windows,插座上有不可避免的1秒超时。连接用于拒绝的TCP连接,而OS"有帮助"的连接最多可重新验证3次。(请参阅:为什么socket.connect在Windows上进行1秒的连接?)。

在linux上,socket.connect如果拒绝该连接,则立即失败,并且可以在没有任何延迟的情况下尝试IPv4连接。此外,某些软件(例如Curl)仅支持将名称分辨率限制为IPv4或IPv6。不幸的是,请求和urllib3不支持这一点,并且似乎不打算很快支持这一点(请参阅:https://github.com/psf/requests/issues/1691)

对于那些试图弄清楚这一点的人,因为没有人在这里给出明确的解决方案:

我前一段时间遇到了这个问题,并注意到烧瓶测试服务器并非并发。除非您并发,否则Python请求将永远需要从烧瓶应用程序检索数据。在您的应用程序中启用"螺纹"。

app.run(port=5000, debug=True, threaded=True)

最新更新