我应该向我们的其他网址提出获取请求,这会触发服务器上的某些活动并最终返回响应。返回响应可能需要超过30分钟。我知道请求没有默认超时。但是,当我提出获取请求时,即使服务器发回响应,30分钟后,请求也不会返回。我确认服务器从日志文件发送了响应。我甚至尝试过使用请求会话,这样我的连接就可以了。它的行为仍然相同。我使用requests v.2.13.0.
这是版本问题还是请求问题。如果请求有问题,我如何提出等待服务器发回响应的get请求?无论如何我的代码很简单,我可以添加以供参考。
import requests
url="www.abcd/efg/hijkl"
response=requests.get(url) #It hangs at this point even if server sends back response.
我使用邮差和谷歌浏览器测试了相同的内容,两者都能在30分钟后得到响应。同样通过将请求更新为2.18.4
仍然是同一个问题来尝试相同的。
编辑1:
如果请求从服务器引发到localhost,则相同的代码可以正常工作。根据@ randomir的建议,似乎是network connection might getting dropped inbetween
的问题,但是如何从客户端处理这个问题,因为很难实现任何服务器端方法。
答案 0 :(得分:4)
您的持久性零活动网络连接可能会被中间代理,防火墙,路由器,NAT等丢弃。requests.get()
永远不会发现它,因为它被动地等待响应。
在TCP层上防止这种情况的一种方法是使用TCP keep-alive(默认情况下通常 off )。
在Python中,您可以通过低级socket.setsockopt
直接配置TCP keep-alive,但由于您已经在使用requests
,因此更简单的方法是通过TCPKeepAliveAdapter
提供requests_toolbelt
包裹:
import requests
from requests_toolbelt.adapters.socket_options import TCPKeepAliveAdapter
url = '...'
session = requests.Session()
keep_alive = TCPKeepAliveAdapter(idle=120, count=20, interval=30)
session.mount(url, keep_alive)
session.get(url)
答案 1 :(得分:0)