在python 2.7中重用httplib.HTTPConnection

时间:2012-11-30 20:43:40

标签: python python-2.7

我最近继承了一个python项目,我正在努力维护它。部分代码从网站发出数十万个请求,并将结果保存到数据库中。代码重用相同的httplib.HTTPConnection对象进行覆盖请求,然后循环遍历

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

response = conn.getresponse()

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

[Errno 104] Connection reset by peer  

其次是每个其他conn.request()失败。我的第一个倾向是为每个请求建立一个新的连接,但这种性能的影响是深刻和可怕的。所以我的问题是,我该如何解决这个问题,特别是因为我不能100%确定我怎么能真正测试它。

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

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

感谢您的时间。

1 个答案:

答案 0 :(得分: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/