【发布时间】: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 #1 和 Python 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秒。如果我的问题是由导入问题引起的,那么只有第一个请求会变慢,对吧?