【问题标题】:Python requests module is very slow on specific machinePython requests 模块在特定机器上非常慢
【发布时间】:2015-09-10 15:01:56
【问题描述】:

我遇到过在某些机器和特定用户上执行 Python 请求的速度太慢,而其他工具(例如 curl)却非常快。奇怪的是,如果以另一个用户身份运行脚本,那么它会按预期运行。如果我在我的机器(Windows 或 Linux)上运行脚本,那么它也会按预期运行。有问题的机器是 Hyper-V 上的 Windows 2008 服务器。我通常使用 POST 请求,但 POST 和 GET 都会受到影响。对于演示,我创建了带有 GET 请求的简单脚本。所有请求大约需要 4.8 秒,但应该大约需要 0.03 秒(虚拟机没有那么强大)。

[imports and logging configuration omitted]

log.info("Started ...")

start = time.time()
response1 = requests.get("http://10.50.30.216:8080/sps/api/version")
assert response1.status_code == codes.OK
log.info("Using requests: %.3fs" % (time.time() - start))

start = time.time()
conn = httplib.HTTPConnection("10.50.30.216:8080")
conn.request("GET", "/sps/api/version")
response2 = conn.getresponse()
assert response2.status == codes.OK
log.info("Using httplib: %.3fs" % (time.time() - start))

log.info("Finished ...")

作为有问题的用户登录时的输出(不幸的是我必须使用该用户)。看到 requests 模块在打开连接之前等待了 4.523 秒,而 httplib 模块立即继续。

2015-09-11 14:50:00,832 - INFO - myscript - Started ...
2015-09-11 14:50:05,355 - INFO - requests.packages.urllib3.connectionpool - Starting new HTTP connection (1): 10.50.30.216
2015-09-11 14:50:05,364 - DEBUG - requests.packages.urllib3.connectionpool - "GET /sps/api/version HTTP/1.1" 200 None
2015-09-11 14:50:05,365 - INFO - myscript - Using requests: 4.533s
2015-09-11 14:50:05,374 - INFO - myscript - Using httplib: 0.008s
2015-09-11 14:50:05,375 - INFO - myscript - Finished ...

以其他用户身份登录时的输出。请注意,两个用户都具有管理员权限,但第二个用户只是临时的,并且只在一台机器上,所以我不能通过切换用户来解决这个问题。

2015-09-11 14:57:45,789 - INFO - myscript - Started ...
2015-09-11 14:57:45,799 - INFO - requests.packages.urllib3.connectionpool - Starting new HTTP connection (1): 10.50.30.216
2015-09-11 14:57:45,806 - DEBUG - requests.packages.urllib3.connectionpool - "GET /sps/api/version HTTP/1.1" 200 None
2015-09-11 14:57:45,809 - INFO - myscript - Using requests: 0.021s
2015-09-11 14:57:45,815 - INFO - myscript - Using httplib: 0.004s
2015-09-11 14:57:45,815 - INFO - myscript - Finished ...

我已阅读 Python requests are slow #1Python requests are slower thann curl 但不适用于我的问题。

【问题讨论】:

  • 尝试分析它:python -m cProfile your_script.py。见this answer
  • 这可能与pyOpenSSLl issue #137 有关。要确认或排除这种情况,请检查python -c "import OpenSSL" 是否已经很慢,或者只是实际请求? (另见requests #2372
  • 感谢您的回复,但我认为这不是我的问题,因为 1) 请求在以其他用户身份运行或在我的笔记本电脑上运行时表现良好。 2)即使一个方法中有一些连续的请求,每个http请求也需要将近5秒。如果我的问题是由导入问题引起的,那么只有第一个请求会变慢,对吧?

标签: python python-requests


【解决方案1】:

对于阅读本文并在其 URL 中使用 localhost 的任何人,我通过将其更改为 127.0.0.1 来解决此问题。

如果这解决了问题,那就是 DNS 问题,而不是请求问题。

【讨论】:

    【解决方案2】:

    可能有很多事情会减慢请求速度。来自 DNS 查找、限制等的任何内容。

    尝试通过打开请求调试日志来获取更多信息

    logging.basicConfig() 
    logging.getLogger().setLevel(logging.DEBUG)
    requests_log = logging.getLogger("requests.packages.urllib3")
    requests_log.setLevel(logging.DEBUG)
    requests_log.propagate = True
    

    【讨论】:

    • 感谢您的提示。我在我的问题中修改了我的示例(添加了日志记录和另一个 http 请求)。我在同一台机器上添加了来自不同用户的输出以查看差异。
    【解决方案3】:

    我也遇到过类似的问题...经过作者的大量调试,我们得出的结论是,原因在于代理检测代码...

    所以,一旦我实现了这个,它就解决了我的类似问题:requests: how to disable / bypass proxy

    作者已经意识到这个问题,他们已经修复了,应该很快就会发布:https://github.com/kennethreitz/requests/pull/2992 ...

    希望对你有帮助...

    干杯 贾卡

    【讨论】:

    • 已经发布了吗?
    【解决方案4】:

    有类似的问题。经过调查确定python对socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):的内部调用导致了延迟。

    在我的配置中,我使用的是 Mac,OS/X 10.11。 hostdev.local,我在 /etc/hosts 中有相关条目,指向仅主机网络上的虚拟机设置。

    192.168.56.101 dev.local
    

    在敲了我一两个小时后,我意识到以 .local 结尾的主机名才是真正的问题(尽管有 /etc/hosts 条目)。

    这最终将我引向https://superuser.com/questions/539849/long-lookup-times-for-local-in-hosts-file。瞧,我只需要避免使用.local 组成主机名。

    我确实意识到这不是问题所在——10.50.30.216 显然不会以.local 结尾!但由于这个问题是我寻找问题答案的最相关问题之一,所以我想我会在这里发布答案。

    【讨论】:

      猜你喜欢
      • 2015-06-27
      • 2013-04-17
      • 1970-01-01
      • 2011-07-14
      • 2016-11-19
      • 1970-01-01
      • 2021-02-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多