Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python请求包:流传输时失去连接_Python_Streaming_Python Requests - Fatal编程技术网

Python请求包:流传输时失去连接

Python请求包:流传输时失去连接,python,streaming,python-requests,Python,Streaming,Python Requests,我想使用Requests包连接到web服务的流式API。假设我使用以下代码发送请求,接收响应,并在响应行到达时迭代响应行: import requests r = requests.get('http://httpbin.org/stream/20', stream=True) for line in r.iter_lines(): if line: print line 在等待接收新数据的同时,我们基本上是在等待r.iter_lines()生成新的数据。但如果我在等

我想使用Requests包连接到web服务的流式API。假设我使用以下代码发送请求,接收响应,并在响应行到达时迭代响应行:

import requests

r = requests.get('http://httpbin.org/stream/20', stream=True)
for line in r.iter_lines():
    if line:
        print line

在等待接收新数据的同时,我们基本上是在等待r.iter_lines()生成新的数据。但如果我在等待时失去了互联网连接怎么办?我如何才能找到答案,以便尝试重新连接?

您可以断开网络连接进行尝试。请求引发此类错误:

requests.exceptions.ConnectionError:HTTPConnectionPool(host='httpbin.org',port=80):url:/stream/20超过了最大重试次数(由:[Errno-3]名称解析暂时失败引起)

错误消息显示已重试网络错误的请求。您可以参考此设置最大重试次数。如果需要更多自定义(例如重试之间的等待),请在循环中执行:

import socket
import requests
import time

MAX_RETRIES = 2
WAIT_SECONDS = 5

for i in range(MAX_RETRIES):
    try:
        r = requests.get('http://releases.ubuntu.com/14.04.1/ubuntu-14.04.1-desktop-amd64.iso',
                         stream=True, timeout=10)
        idx = 1
        for chunk in r.iter_content(chunk_size=1024):
            if chunk:
                print 'Chunk %d received' % idx
                idx += 1
        break
    except requests.exceptions.ConnectionError:
        print 'build http connection failed'
    except socket.timeout:
        print 'download failed'
    time.sleep(WAIT_SECONDS)
else:
    print 'all tries failed'
编辑:我测试了一个大文件。我改用了
iter\u content
,因为它是一个二进制文件<代码>国际热核试验堆线路基于国际热核试验堆内容(),因此我认为行为是相同的。步骤:在网络连接的情况下运行代码。收到一些块后,断开连接。等待2-3秒,重新连接,下载继续。因此,请求包会对迭代中丢失的连接进行重试


注意:如果在构建连接时没有网络(
请求.get()
),则会引发ConnectionError;如果网络在
iter\u线路中丢失
/
iter\u内容
,将引发socket.timeout。

感谢您的回复。我认为这行不通。当我断开连接时,iter_线不会引发任何异常。我认为只有在requests.get()调用失败时才会引发ConnectionError异常。我感兴趣的情况是,当请求成功返回时,然后iter_lines()开始生成行,然后连接丢失。在这种情况下,我看到的是脚本只是挂起。没有错误消息,没有引发异常。我对其运行了测试。请求包不会重试iter_线路()中的连接丢失。如果重试失败,您可以捕获套接字超时。请看最新的答案,你是对的。我升级到了最新版本,现在iter_生产线提出了一个例外。我想我的旧版本里没有。