我最近继承了一个python项目,我正在努力维护它。部分代码从网站发出数十万个请求,并将结果保存到数据库中。代码重用相同的httplib.HTTPConnection对象进行覆盖请求,然后循环遍历
conn.request("GET",someString,'',headers)
response = conn.getresponse()
部分。几天前,在我的日志中,我看到其中一个请求引发了异常:
[Errno 104] Connection reset by peer
其次是每个其他conn.request()失败。我的第一个倾向是为每个请求建立一个新的连接,但这种性能的影响是深刻和可怕的。所以我的问题是,我该如何解决这个问题,特别是因为我不能100%确定我怎么能真正测试它。
如果我在异常后调用conn.connect(),它会正确重新连接吗?
我正在寻找有关如何修复它以及可能我如何测试它的建议。
感谢您的时间。
答案 0 :(得分:3)
我认为您首先需要决定要处理的故障模式。例如,由于服务器上的临时资源问题而重置连接,并且快速周转连接会修复它吗?或者,服务器是关闭还是重新启动,您应该中止您的流程?
假设第一个案例,我认为你正在思考正确的方向。尝试这样的事情(注意,这不是工作代码 - 它只是逻辑的一个例子):
while True:
try:
conn.request("GET",someString,'',headers)
response = conn.getresponse()
except httplib.HTTPException, e:
conn.connect()
continue
break
您应该添加一些逻辑来在重复连接尝试之间暂停,并在经过一定次数的尝试后放弃(这基本上是上面的第二种情况)。
为了测试这一点,请尝试使用tcpkill使TCP连接重置: