У меня есть код для чтения 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(), который не подходит для меня, поскольку я использую потоки.
Какие еще существуют опции? Есть ли библиотека 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 таймауты полностью игнорируются.