Python请求:允许更多重试

Python请求:允许更多重试,python,api,pandas,ubuntu,python-requests,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 = paylo

我有一个网站,它有两个服务器——一个专用于面向客户端的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)
counter   = 0
max_tries = 10

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

        return code, res

    except requests.exceptions.ConnectionError, e:
        counter += 1
        time.sleep(1)
…在过去一年的大部分时间里,它一直像钟表一样运转。然而,在数据服务器上创建了一个pandas重载函数之后,我得到了以下错误(我无法想象这与pandas有任何关系,但我认为无论如何我都会把它扔出去):

HTTPSConnectionPool(host='data.mywebsite.com',port=443):
url:/\u api\u路由?…超过最大重试次数?。。。。。。
(由“”引起)
这两台服务器都运行ubuntu和python,并使用请求库处理服务器之间的通信

这里有一个类似的问题:
,但OP要求联系一个他无法控制的服务器-我可以对双方进行编码,因此我希望我可以在数据服务器上更改一些内容,但不确定会是什么。

如果重试,更改号码将无法解决您的问题<“代码>由以下原因引起:”是您应该修复的。服务器返回了一个空的HTTP状态码,而不是像“200”或“500”这样的代码。

如果重试无法解决问题,则更改数字<“代码>由以下原因引起:”是您应该修复的。服务器返回了一个空的HTTP状态码,而不是像“200”或“500”这样的代码。

我已经在已知的internet上搜索了这个问题的解决方案,我想我不会在不久的将来找到解决方案

相反,我构建了一个内部重试循环(在python中),延迟1秒,如下所示:

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

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

        return code, res

    except requests.exceptions.ConnectionError, e:
        counter += 1
        time.sleep(1)
计数器=0
最大值=10
当计数器

这绝对不是一个解决方案,因为它是一个解决办法,但现在,它只是这样做,它的工作。。。假设它不需要重试超过10次。

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

相反,我构建了一个内部重试循环(在python中),延迟1秒,如下所示:

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

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

        return code, res

    except requests.exceptions.ConnectionError, e:
        counter += 1
        time.sleep(1)
计数器=0
最大值=10
当计数器

这绝对不是一个解决方案,因为它是一个解决办法,但现在,它只是这样做,它的工作。。。假设它不必重试超过10次。

如果您还没有,解决方案是使用诸如
uWSGI
gunicorn
之类的容器来处理并发,如果您还没有,再次使用
Nginx
Apache
来托管服务器。我已经使用了相当多的
uWSGI
,它的配置非常简单。要创建更多处理请求的进程,只需在
.ini
文件中设置
processs=2
。您也可以使用
Nginx
Apache
来生成进程,但是
uWSGI
是专门为python构建的,并且与
Flask
一起工作非常出色。我建议您实现这是您尚未实现的,然后在递增进程数时观察内存和处理器使用情况,直到找到服务器可以处理的好数字


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

如果你还没有,要使用诸如
uWSGI
gunicorn
之类的容器来处理并发性,如果还没有,请再次使用
Nginx
Apache
来托管服务器。我已经使用了相当多的
uWSGI
,它的配置非常简单。要创建更多处理请求的进程,只需在
.ini
文件中设置
processs=2
。您也可以使用
Nginx
Apache
来生成进程,但是
uWSGI
是专门为python构建的,并且与
Flask
一起工作非常出色。我建议您实现这是您尚未实现的,然后在递增进程数时观察内存和处理器使用情况,直到找到服务器可以处理的好数字


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

嗨,Stephane-感谢您的快速响应,但我不确定如何修复这条线路。有什么想法吗?可能是数据服务器代码中的错误。仅使用所提供的信息,我们可以说的就不多了。顺便说一下,在请求库中,HTTP状态代码可与r.status\u代码一起使用,而不是r.status。这就是为什么你有一个AttributeError…虽然我上面的黑客经常工作,但它并不总是工作。据我所知,这取决于风向。我将用25个同时调用运行一次,它们都会工作,再运行一次,有些会失败。我确实使用了
status\u code
,对于那些有效的,我得到了200分