Python 3 - 请求库 - iter_lines - 在读取流数据块时处理可能的服务器停顿

时间:2018-04-06 13:37:32

标签: python python-requests

当我从中读取数据时,我需要找到一种顺畅管理服务器停顿的方法。我在下面写了一段代码:

def listener():    
    resp = requests.get(someurl, stream=True)
    if resp.status_code == 200:
        for line in resp.iter_lines():            
            if line:
                do_something_with_the_line
                print(result)

price_thread = threading.Thread(target=listener, name="StreamingThread", args=[])
trade_thread.start()

代码运行良好,直到服务器停止发生(API提供商建议在10秒内没有收到“行”时发生停顿。)

如何在我的代码中实现这一点? 换句话说,当发生停顿时,我会尝试回忆listener方法而不退出price_thread线程。

提前致谢

1 个答案:

答案 0 :(得分:0)

您可以使用timeout属性确保在指定的时间内未收到任何数据后断开连接,然后重新建立连接:

def listener():
    while True:
        try:
            resp = requests.get(someurl, stream=True, timeout=10)
            if resp.status_code == 200:
                for line in resp.iter_lines():
                    if line:
                        # do_something_with_the_line
                        pass
            elif resp.status_code == 429:
                    print("Too many reconnects, exiting.")
                    break
            else:
                print("Unhandled status `{}` retreived, exiting.".format(resp.status_code))
                break
        except requests.exceptions.Timeout:
            pass  # we'll ignore timeout errors and reconnect
        except requests.exceptions.RequestException as e:
            print("Request exception `{}`, exiting".format(e))
            break

您也可以添加重新连接计数器,而不是无限期地while True循环。