Что мне делать с зависанием запроса http POST в python? - PullRequest
0 голосов
/ 10 декабря 2011

Пример кода:

socket.setdefaulttimeout(150)

MechBrowser = mechanize.Browser()
Header = {'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 GTB7.1 (.NET CLR 3.5.30729)'}
Url = "http://example.com"
Data = "Justatest=whatever&letstry=doit"
Request = urllib2.Request(Url, Data, Header)
Response = MechBrowser.open(Request)
Response.close()

Я не думаю, что с вышеприведенными кодами что-то не так, но время от времени я получаю зависающий запрос http POST, который мешает непрерывному запуску всего скрипта.Я уже использовал socket.setdefaulttimeout(150) почему это не работает?В чем причина этой проблемы?И что мне делать, чтобы избавиться от этого?

Ответы [ 3 ]

0 голосов
/ 13 декабря 2011

Я думаю, это потому, что вы не установили заголовок длины содержимого.если запрос отправлен на сервер, данные отправляются в теле запроса.Из-за характеристик потокового соединения tcp сервер не может определить длину запроса, если вы явно не укажете это в заголовке.не зная, когда ваш запрос заканчивается, сервер должен ждать бесконечно.

, и атрибут timeout здесь не работает, потому что ваш сокет не заблокирован ни при какой операции recv / send.Вы закончили запись данных через сокет, но сервер считает, что вам нужно больше отправлять.

0 голосов
/ 28 ноября 2016

Нашел проблему.

Я недавно использовал requests и понял, что timeout, установленный вами как mechanize, так и requests, "НЕ ограничивает время загрузки всего ответа", что означает, что если соединение действительно очень медленное и передача данных все еще продолжается, он не истечет время ожидания, что может привести к зависанию соединения на довольно длительное время.

Итак, что я сделал, это обернул эти запросы потоками и установил таймаут для этих потоков, и этот путь более точен, просто убедитесь, что вы очищаете / собираете мусор для этих зависших соединений.

0 голосов
/ 10 декабря 2011

Может быть много причин - сервер, на который вы отправляете сообщения, может быть занят, перегрузка сети и т. Д.

Однако вы можете устранить проблемы со своей стороны, убедившись, что отправляете полные заголовки (у вас отсутствует заголовок Content-type).

...