我最近继承了一个python项目,现在正在维护它。部分代码从网站发出数十万个请求,并将结果保存到数据库中。该代码重用相同的 httplib.HTTPConnection 对象来发送请求,然后循环
conn.request("GET",someString,'',headers)
response = conn.getresponse()
部分。几天前,在我的日志中,我看到其中一个请求引发了异常:
[Errno 104] Connection reset by peer
接下来是所有其他 conn.request() 失败。我的第一个倾向是为每个请求建立一个新的连接,但这样做对性能的影响是深远而可怕的。所以我的问题是,我该如何解决这个问题,特别是因为我不确定如何真正测试这个问题。
如果我在异常后调用 conn.connect() ,它会正确地重新连接吗?
我正在寻找有关如何修复它以及如何测试它的建议。
谢谢你的时间。
我认为你首先需要决定你想要处理的故障模式。例如,连接是否由于服务器上的临时资源问题而重置,并且快速周转连接可以修复它?或者,服务器是否已关闭或正在重新启动,您应该中止进程?
假设第一种情况,我认为你的想法是正确的。尝试这样的事情(注意,这不是工作代码 - 它只是逻辑的一个示例):
while True:
try:
conn.request("GET",someString,'',headers)
response = conn.getresponse()
except httplib.HTTPException, e:
conn.connect()
continue
break
您可能应该添加一些逻辑,以在重复的连接尝试之间暂停并在一定次数的尝试后放弃(这基本上是上面的第二种情况)。
为了测试这一点,请尝试使用 tcpkill 来重置 TCP 连接:
http://www.gnutoolbox.com/tcpkill-command/ http://www.gnutoolbox.com/tcpkill-command/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)