Тайм-аут чтения с использованием urllib2 или любой другой библиотеки HTTP.Python

Программы на Python
Ответить
Anonymous
 Тайм-аут чтения с использованием urllib2 или любой другой библиотеки HTTP.

Сообщение Anonymous »

У меня есть код для чтения такого URL:

Код: Выделить всё

from urllib2 import Request, urlopen

req = Request(url)
for key, val in headers.items():
req.add_header(key, val)
res = urlopen(req, timeout = timeout)
# This line blocks
content = res.read()
Тайм-аут работает для вызова urlopen(). Но затем код переходит к вызову res.read(), где я хочу прочитать данные ответа, и тайм-аут там не применяется. Таким образом, вызов read() может зависать почти вечно в ожидании данных с сервера. Единственное решение, которое я нашел, — это использовать сигнал для прерывания read(), который мне не подходит, поскольку я использую потоки.
Какие еще варианты существуют? Существует ли HTTP-библиотека для Python, которая обрабатывает тайм-ауты чтения? Я просмотрел httplib2 и запросы, и они, похоже, страдают той же проблемой, что и выше. Я не хочу писать свой собственный неблокирующий сетевой код с использованием модуля сокета, поскольку считаю, что для этого уже должна быть библиотека.
Ни одно из приведенных ниже решений не делает этого за меня. Вы можете сами убедиться, что установка таймаута сокета или urlopen не имеет никакого эффекта при загрузке большого файла:

Код: Выделить всё

from urllib2 import urlopen

url = 'http://iso.linuxquestions.org/download/388/7163/http/se.releases.ubuntu.com/ubuntu-12.04.3-desktop-i386.iso'
c = urlopen(url)
c.read()
По крайней мере, в Windows с Python 2.7.3 тайм-ауты полностью игнорируются.

Подробнее здесь: https://stackoverflow.com/questions/954 ... tp-library
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»