我只想查询在循环发送相同的POST请求时重用相同的连接。假设我有这个代码:
import requests
import time
r = requests.Session()
url = "http://somenumbers.php"
while True:
x = r.post(url)
time.sleep(10)
现在根据documentation of requests library
好消息 - 感谢urllib3,keep-alive在会话中是100%自动的!您在会话中发出的任何请求都将自动重用相应的连接! 请注意,只有在读取了所有正文数据后,才会将连接释放回池中以供重复使用;确保将stream设置为False或读取Response对象的content属性
这适用于上面的代码吗?我试图阻止发送相同的请求,以防服务器冻结或发生读取超时。在Issue with sending POST requests using the library requests中,我回顾了整个问题,其中一个建议是重用连接,但
不是在同一个连接上发送相同的请求只会意味着多个条目,或者它是否会解决问题,因为它只会在文档说明时发送一个条目时撤回? / p>
假设后者是真的,不会影响性能并导致长时间延迟,因为请求被困在连接中?!
答案 0 :(得分:1)
r.post
是一个阻止通话。只有在发送请求并收到响应后,该功能才会返回。只要在循环终止之前访问x.content
,下一个循环将重用底层TCP连接。
不是在同一个连接上发送相同的请求只是意味着 多个条目,或者它是否会解决问题,因为它只会 当文档说明发送一个条目时拉回?
requests
不会缓存响应。它不会检查先前的请求是否具有相同的参数。如果您需要,您必须自己构建一些东西。
不会影响性能并导致自请求以来的长时间延迟 被困在连接中
requests
只会重新使用可用的连接。如果不存在空闲连接,则将建立新连接。您可以使用requests.packages.urllib3.poolmanager.PoolManager
来控制池中的连接数。