我最近继承了一个python项目,现在正在维护它。部分代码从一个网站发出几十万个请求,并将结果保存到数据库中。代码将同一个httplib.HTTPConnection对象用于reach请求,然后在

conn.request("GET",someString,'',headers)

response = conn.getresponse()

章节。几天前,在我的日志中,我看到其中一个请求引发了异常:
[Errno 104] Connection reset by peer

接着是其他连接请求()失败。我的第一个倾向是为每一个请求建立一个新的连接,但这对性能的影响是深远和可怕的。所以我的问题是,我该如何解决这个问题,特别是因为我不能百分之百确定我如何才能真正测试这个问题。
如果我在异常之后调用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/

07-25 21:40