Найти - Пользователи
Полная версия: Невозможность задать timeout для urllib3/requests библиотек
Начало » Network » Невозможность задать timeout для urllib3/requests библиотек
1
lorien
Вопрос пользователям библиотек urllib3 и requests (работает поверх urllib3)
Вас не смущает тот факт, что нельзя задать лимит времени на обработку сетевого запроса? Другими словами, вы не знаете, когда у вас отработает сетевой вызов. Обработка сетевого вызова будет длиться вечно, если вам не повезло с сервером, который выдаёт ответ.

У библиотеки urllib3 есть механизм таймаутов `Timeout(connect=…, read=…), но они решают другие задачи: connect - это таймаут на подключение к серверу, read - таймат на ожидание очередной порции данных от сервера. Т.е. если read timeot равен одной секунде, а сервер выдаёт данные по одному байту раз в 0.5 секунд, то вы будете скачивать 100 килобайт оооочень долго и не выскочит никакой ошибки.

Можете сами проверить, вот код для запуска “медленного” сервера, который выдаёт данные в час по чайной ложке

from http.server import HTTPServer, BaseHTTPRequestHandler
import time

class SlowHandler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.end_headers()
while True:
self.wfile.write(b'x')
time.sleep(0.1)


def main():
server = HTTPServer(('', 8000), SlowHandler)
server.serve_forever()


if __name__ == '__main__':
main()
PooH
Не смущает. Я запросы делаю из очереди задач(celery), а в ней есть таймаут для всей таски.
lorien
А я без celery и меня смущает. Но я уже зафиксил этот момент: https://github.com/lorien/grab/blob/master/grab/transport/urllib3.py#L294
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB