Python 如何检查使用请求模块的程序是否死机

Python 如何检查使用请求模块的程序是否死机,python,web-crawler,download,Python,Web Crawler,Download,我试图使用python下载一批文件,我使用打开流的requests模块,换句话说,我在200K块中检索每个文件。 然而,有时下载可能会停止,因为它只是被卡住,没有响应,也没有错误。我想这是因为我的电脑和服务器之间的连接不够稳定。这是我的问题,如何检查这种停止并建立新连接 当服务器停止发送字节时,您可能不想从外部检测到这一点,您可以使用“请求失败”来代替“停止” 由于您没有向我们展示您的代码,因此很难向您展示如何更改它…但我将向您展示如何更改其他一些代码: # hanging text = req

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

当服务器停止发送字节时,您可能不想从外部检测到这一点,您可以使用“请求失败”来代替“停止”

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

# 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
如果出于某种原因确实希望从外部检测到它,则需要使用或类似的方法将请求驱动的代码移动到子进程。理想情况下,您希望它在某个队列或集合上发布更新,并每隔200KB通知某个受条件保护的共享标志变量,然后主进程可以阻塞队列或条件,并在超时时杀死子进程。例如,伪代码:

def _download(url, q):
    create request
    for each 200kb block downloaded:
        q.post(buf)

def download(url):
    q = multiprocessing.Queue()
    with multiprocessing.Process(_download, args=(url, q)) as proc:
        try:
            return ''.join(iter(functools.partial(q.get, timeout=10.0)))
        except multiprocessing.Empty:
            proc.kill()
            # failed, do something else

谢谢,这就是我需要的!有人能告诉我为什么被否决吗?如果我不得不猜测的话,我会说你被否决的最可能的原因是,你没有给我们一个答案,而是给了我们一个模糊的代码描述。这使得你很难确定你问的是你似乎在问的问题,这意味着答案不能仅仅告诉你如何修改代码,它必须用更抽象的术语解释问题。我并不觉得这个问题太含糊而无法回答,但如果可以的话,最好是具体而完整。另一种可能是选民认为这是一件小事,你只要看一下文件就可以发现,尽管我不确定我是否同意;您必须知道单词timeout才能搜索它…。当然,选民也不喜欢名字中有数字的人,除非他们的名字中有4,或者他的猫在键盘上走着我只是忘了使用timeout,这的确是一个愚蠢的问题,但当一个人对请求不太熟悉时,它总是会发生。无论如何,谢谢你们的建议和帮助,下次当我问问题时,我会发布一些代码@阿巴内特