如何检查使用请求模块的程序是否已经死亡

时间:2015-05-17 18:40:22

标签: python web-crawler downloading

我正在尝试使用python下载一批文件,我使用请求模块打开流,换句话说,我检索200K块中的每个文件。 但是,有时,下载可能会停止,因为它只是卡住(没有响应)并且没有错误。我想这是因为我的电脑和服务器之间的连接不够稳定。这是我的问题,如何检查这种停止并建立新连接?

1 个答案:

答案 0 :(得分:2)

你可能希望从外部检测到这种情况,当你可以使用timeoutsrequests失败而不是停止服务器停止发送字节时。

由于您没有向我们展示您的代码,因此很难向您展示如何更改代码......但我将向您展示如何更改其他代码:

# hanging
text = requests.get(url).text

# not hanging
try:
    text = requests.get(url, timeout=10.0).text
except requests.exceptions.Timeout:
    # failed, do something else

# trying until success
while True:
    try:
        text = requests.get(url, timeout=10.0).text
        break
    except requests.exceptions.Timeout:
        pass

如果您想要出于某种原因从外部检测到它,您需要使用multiprocessing或类似内容将requests驱动的代码移动到孩子身上处理。理想情况下,您希望它在某些Queue上发布更新,或者每200KB设置并通知一些Condition - 受保护的共享标志变量,然后主进程可以阻止Queue或{{ 1}}和Condition子进程如果超时。例如(伪代码):

kill