在Python 2.7中重用httplib.HTTPConnection

3

我最近接手了一个Python项目,现在正在维护它。代码的一部分从网站发出几十万个请求,并将结果保存到数据库中。代码重复使用相同的httplib.HTTPConnection对象进行每个请求,然后只是循环执行。

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

response = conn.getresponse()

部分。几天前在我的日志中,我看到其中一个请求抛出了异常:

[Errno 104] Connection reset by peer  

紧接着每次conn.request()失败。 我最初的想法是为每个请求建立一个新连接,但这样做会对性能造成严重和可怕的影响。 所以我的问题是,我该如何解决这个问题,特别是因为我甚至不确定如何真正测试它。

如果我在异常后只调用conn.connect(),它会正确重新连接吗?

我正在寻求有关如何修复它以及可能如何测试它的建议。

感谢您的时间。

1个回答

3

我认为你首先需要确定你想要处理的故障模式。例如,连接是否因服务器上的临时资源问题而重置,快速重新连接即可解决?或者,服务器已经关闭或正在重启,你应该中止你的进程?

假设是第一种情况,我认为你考虑得很正确。尝试像这样做(注意,这不是工作代码 - 它只是逻辑的一个示例):

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/


1
鉴于httplib,这是最好的方法。然而,对于OP来说,切换到更强大的库(如urllib3或requests)可能会更容易(requests是urllib3的包装器)。urllib3处理连接池和重用连接,并在一个连接死亡时启动一个新连接。它会自动完成所有这些操作。httplib被认为已过时。 - Anorov
TCPkill很棒,谢谢你向我展示它。我也会像Anorov建议的那样考虑切换到urllib3。谢谢你们两个。 - Dio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接