我的网站有两台服务器 - 一台专门面向客户端的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正在询问联系他无法控制的服务器 - 我可以对双方进行编码,所以我希望我可以在我的数据服务器上更改某些内容,但我不确定它是什么会的。
答案 0 :(得分:1)
如果重试更改号码将无法解决您的问题。 Caused by <class 'httplib.BadStatusLine'>: ''
是您应该解决的问题。服务器返回一个空的HTTP状态代码,而不是“200”或“500”。
答案 1 :(得分:1)
如果您还没有使用gunicorn
或Nginx
之类的容器来处理并发性,那么解决方案就是这样,如果您还没有,请再次使用{{1或Apache
来托管服务器。我已经使用uWSGI
一个相当数量,它的配置非常简单。要创建更多流程来处理请求,您只需在processes = 2
文件中设置.ini
即可。您还可以使用Nginx
或Apache
来生成进程,但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次。