2016-08-30 2 views
4

Я использую requests, чтобы получить URL, например:запросы процесс зависает

while True: 
    try: 
     rv = requests.get(url, timeout=1) 
     doSth(rv) 
    except socket.timeout as e: 
     print e 
    except Exception as e: 
     print e 

После он работает на некоторое время, он прекращает работать. Никаких исключений или каких-либо ошибок, так же как и приостановлено. Затем я останавливаю процесс, набрав Ctrl + C с консоли. Он показывает, что процесс ожидает данных:

............. 
    httplib_response = conn.getresponse(buffering=True) #httplib.py 
    response.begin() #httplib.py 
    version, status, reason = self._read_status() #httplib.py 
    line = self.fp.readline(_MAXLINE + 1) #httplib.py 
    data = self._sock.recv(self._rbufsize) #socket.py 
KeyboardInterrupt 

Почему это происходит? Есть ли решение?

+2

Он ждет на сервере отправки данных, и вы ничего не сможете сделать на стороне клиента. Возможно, сервер намеренно дросселирует вас? –

+0

Я так думаю. И я должен снизить частоту запроса данных, верно? Любое другое предложение – bin381

+0

Afait, это ваш единственный вариант. Просто следите за тем, чтобы время ожидания при настройке 'timeout' -' 10ms', скорее всего, не сработает. – nlsdfnbch

ответ

5

Похоже, что сервер вы отправляете свой request в это дросселирования вас - то есть, он посылает bytes менее 1 секунды между каждым пакетом (таким образом, не вызывая ваш параметр timeout), но достаточно медленно для того, чтобы появиться застрять.

Единственное исправление, о котором я могу думать, состоит в том, чтобы уменьшить параметр timeout, если вы не можете устранить эту проблему с использованием поставщика сервера.

Помните, что при настройке параметра timeout необходимо учитывать latency, иначе ваше соединение будет сброшено слишком быстро и может не работать вообще.

Смежные вопросы