сделать HTTP-запрос от python и долго ждать ответа

Я использую Python для доступа к REST API, который иногда занимает много времени (более 5 минут). Я использую pyelasticsearch для выполнения запроса и попытался установить тайм-аут на 10 минут следующим образом:

es = ElasticSearch(config["es_server_url"], timeout=600)
results = es.send_request("POST", 
                      [config["es_index"], "_search_with_clusters" ],
                      cluster_query)

но время ожидания истекает через 5 минут (не 10) с requests.exceptions.ConnectionError (Caused by <class 'socket.error'>: [Errno 104] Connection reset by peer)

Я попытался установить тайм-аут сокета и использовать запросы напрямую следующим образом:

socket.setdefaulttimeout(600)
try:
    r = requests.post(url, data=post, timeout=600)
except:
    print "timed out"

и время ожидания истекает примерно через 5 минут каждый раз.

Как я могу заставить мой скрипт ждать дольше, пока запрос не вернется?


person kielni    schedule 25.10.2013    source источник
comment
Эта ошибка означает, что сервер закрыл для вас сокет, поэтому указание более длительного времени ожидания на вашей стороне не поможет. (Это также может означать, что у корпоративного веб-прокси, с которым вы действительно общаетесь, истекло время ожидания, или что какой-то маршрутизатор посередине решил отключить вас. Но чего не может быть, так это тайм-аут вашего кода.) сервер свой код, или чужой?   -  person abarnert    schedule 26.10.2013
comment
Да, это мой сервер. Спасибо за чаевые. Я попытался сделать запрос непосредственно к фактическому имени сервера: порт, и это удалось через 8,5 минут. Это был BigIP, закрывающий соединение через 5 минут.   -  person kielni    schedule 26.10.2013


Ответы (1)


Ошибка «Соединение сброшено одноранговым узлом», также известная как ECONNRESET, означает, что сервер — или какой-либо маршрутизатор или прокси-сервер между вами и сервером — принудительно закрыл соединение.

Таким образом, указание более длительного тайм-аута на вашей стороне не будет иметь никакого значения. Вам нужно выяснить, кто закрывает соединение, и настроить его на более длительное ожидание.

Подходящими местами для поиска являются само серверное приложение, любая серверная программа, управляющая этим приложением (например, если вы используете Apache с mod_wsgi, Apache), балансирующий маршрутизатор или внешний сервер или обратный прокси-сервер перед этим сервером, или веб-прокси перед вашим клиентом.

Как только вы выясните, в чем проблема, если это то, что вы не можете исправить самостоятельно, вы можете исправить это, просочившись от сервера к клиенту — пусть он отправит что-то бесполезное, но безвредное (HTTP 100, дополнительный заголовок , некоторый основной текст, который ваш клиент может пропустить, что угодно) каждые 120 секунд. Это может работать или не работать, в зависимости от того, какой компонент зависает.

person abarnert    schedule 25.10.2013