2017-03-27 3 views
0

두 개의 서버가있는 웹 사이트가 있습니다. 하나는 클라이언트 측 웹 서비스 전용이고 다른 하나는 비싸 데이터 처리 서버입니다.Python 요청 : 재시도 허용

나는 현재 프로세스를 보유하고있는 웹 서버 연락처 일반적으로 다음과 같이 여러 요청에 대한 데이터 서버 :

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

... 과거의 좋은 부분에 대한 시계처럼 실행되었습니다 년. 그러나 데이터 서버에 pandas-heavy 함수를 만든 후에 나는 다음과 같은 오류가 발생했습니다 (팬더와 관련이 없다는 것을 상상할 수는 없지만 어쨌든 그것을 버릴 것이라고 생각했습니다) :

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

두 서버 모두 우분투, 파이썬 및 요청 라이브러리를 사용하여 서버 간의 통신을 처리합니다.

여기에 비슷한 질문이 있습니다. Max retries exceeded with URL - OP가 제어 권한이없는 서버에 문의하는 중입니다. 양면 코드를 작성할 수 있으므로 데이터 서버에서 변경할 수 있기를 바랍니다. 하지만 그것이 무엇이 될지 확실하지 않습니다.

+1

질문을 데이터 처리 서버의보기에 대한 return 문과 함께 업데이트하십시오. 코드에 오류가 있거나 명시 적으로 응답의 상태를 설정하지 않은 경우에는 200으로 설정해야합니다. 추측 할 수없는 경우보기에 오류가 있지만 로그에 매우 분명해야합니다.거기에 아무런 오류가 없다면 데이터를 ['curl -v'] (http://stackoverflow.com/a/7173011/5854907)로 심층 처리 서버로 보내려고합니다. 그러면 응답을 정확히 볼 수 있습니다 입니다. –

+0

@AllieFitter - 아이디어에 감사드립니다. 우리는 컬 요청을 모방하기 위해'서브 프로세스 (subprocess) '를 실행했고 이것은 문제 해결 프로세스에서 도움이되었습니다. 그러나 실제 문제는 웹 서버에서 데이터 서버로 진행되는 동시 요청 수입니다. 단일 요청도 문제가되지 않았지만 여러 동시 요청으로 인해 문제가 발생했습니다. 이후 jQuery 스크립트에서 0.5 초 지연을 추가하고 모든 것이 잘 작동하는 것 같습니다. – pshep123

답변

1

재 시도하면 번호를 변경해도 문제가 해결되지 않습니다. Caused by <class 'httplib.BadStatusLine'>: ''을 수정해야합니다. 서버가 "200"또는 "500"과 같은 빈 HTTP 상태 코드를 반환했습니다.

+0

Stephane 안녕하세요. 빠른 응답을 보내 주셔서 감사합니다.하지만 어떻게 수정해야할지 모르겠습니다. 이견있는 사람? – pshep123

+0

아마도 데이터 서버 코드의 버그 일 것입니다. 제공된 정보만으로는 말할 수 없습니다. –

+0

관련 스택 : http://stackoverflow.com/questions/27619258/httplib-badstatusline –

-1

나는이 문제에 대한 해결책으로 알려진 인터넷을 샅샅이 뒤 졌어. 가까운 장래에 찾을 생각이 없다.

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) 

그것은만큼 그것이 해결 방법이기 때문에 확실히 솔루션 아니다 :

대신에, 나는 이런 식으로 뭔가를 보이는 1 초 지연에 (파이썬) 내부 재시도 루프에 내장 그러나 지금은 단지 작동합니다 ... 10 회 이상 재 시도 할 필요가 없다고 가정하면 작동합니다. 당신은 당신이 이미하지 않은 경우, 다시 한 번, 그리고 동시성을 처리 할 수 ​​uWSGI 또는 gunicorn 같은 컨테이너를 사용 Nginx 또는 Apache 서버를 호스팅하는 데 사용하는, 이미하지 않은 경우

1

해결책은 될 것이다. 난 uWSGI 공정한 금액을 사용하고 구성은 매우 간단합니다. 요청을 처리 할 더 많은 프로세스를 만들려면 .ini 파일에 processes = 2을 설정하기 만하면됩니다. Nginx 또는 Apache을 사용하여 프로세스를 생성 할 수도 있지만 uWSGI은 특별히 파이썬 용으로 작성되었으며 Flask으로 훌륭하게 작동합니다. 나는 이것을 구현하지 말고, 서버가 처리 할 수있는 좋은 번호를 찾을 때까지 숫자 프로세스를 증가시킬 때 메모리와 프로세서 사용을 관찰 할 것을 권고한다.

편집 : 마찬가지로 P. 나는 Nginx 서버에서 uWSGI을 사용하여 상당히 베어 본 하드웨어 (2.5Ghz 듀얼 코어)와 16 개의 프로세스로 평균 약 40 %의 CPU 사용량을 가진 Flask 앱을 실행합니다.

+0

Allie - 당신이 옳다고 생각합니다. 서버 수준의 수정이 필요합니다. 불행히도 나는 uWSGI 등을 업데이트하는 방법에 관해서는 알지 못하지만, 나는 그것에 대해 조사 할 것이다. 그리고 예, 이미 Apache와 Flask를 사용하고 있습니다. – pshep123