Python请求:允许更多重试

时间:2017-03-27 21:40:36

标签: python api pandas ubuntu python-requests

我的网站有两台服务器 - 一台专门面向客户端的Web服务,另一台是更强大的数据处理服务器。

我目前有一个流程,其中Web服务器联系数据服务器以获取通常如下所示的多个请求:

payload = {'req_type':'data_processing', 'sub_type':'data_crunch', 'id_num':12345} 
r = requests.get('https://data.mywebsite.com/_api_route', params = payload)

......在过去一年的大部分时间里,它一直像钟表一样运转。但是,在数据服务器上创建了一个大熊猫重的功能之后,我发现了以下错误(我无法想象它与大熊猫有什么关系,但我以为我把它丢掉了无论如何):

HTTPSConnectionPool(host='data.mywebsite.com', port=443): 
    Max retries exceeded with url: /_api_route?...... 
    (Caused by <class 'httplib.BadStatusLine'>: '')

两台服务器都运行带有python的ubuntu,以及用于处理服务器之间通信的Requests库。

这里有一个类似的问题: Max retries exceeded with URL,但OP正在询问联系他无法控制的服务器 - 我可以对双方进行编码,所以我希望我可以在我的数据服务器上更改某些内容,但我不确定它是什么会的。

3 个答案:

答案 0 :(得分:1)

如果重试更改号码将无法解决您的问题。 Caused by <class 'httplib.BadStatusLine'>: ''是您应该解决的问题。服务器返回一个空的HTTP状态代码,而不是“200”或“500”。

答案 1 :(得分:1)

如果您还没有使用gunicornNginx之类的容器来处理并发性,那么解决方案就是这样,如果您还没有,请再次使用{{1或Apache来托管服务器。我已经使用uWSGI一个相当数量,它的配置非常简单。要创建更多流程来处理请求,您只需在processes = 2文件中设置.ini即可。您还可以使用NginxApache来生成进程,但uWSGI是专门为python构建的,并且与Flask完美配合。我建议你实现这是你还没有,然后在增加数字进程时观察内存和处理器的使用情况,直到你找到一个服务器可以处理的好数字。

编辑:就像P.S.我在Flask服务器上使用Nginx使用相当简单的硬件(仅2.5Ghz双核)和16个进程运行uWSGI应用程序,平均大约40%的CPU使用率。

答案 2 :(得分:-1)

我已经在已知的互联网上搜索了这个问题的解决方案,我不认为我会在不久的将来找到一个。

相反,我在1秒的延迟内置了一个内部重试循环(在python中),看起来像这样:

counter = 0
while counter < 10:
    try:
        r = requests.get('https://data.mywebsite.com/_api_route', params = payload)
        counter = 10
        code = r.json()['r']['code']
        res = r.json()['r']['response']
        return code, res

    except requests.exceptions.ConnectionError, e:
        counter += 1
        time.sleep(1)

它绝对不是解决方案,因为它是一种解决方法,但就目前而言,它确实如此,它有效...假设它不必重试超过10次。