Запор Python urllib2 сокетов - PullRequest
       29

Запор Python urllib2 сокетов

0 голосов
/ 15 октября 2010

Я искал в Интернете поиски решения моей проблемы с Python.Я пытаюсь использовать соединение urllib2 для чтения потенциально бесконечного потока данных с HTTP-сервера.Это часть интерактивного общения, поэтому важно, чтобы я мог получать доступные данные, даже если он не заполнен целым буфером.Кажется, нет никакого способа заставить read \ readline вернуть доступные данные.Это навсегда заблокирует ожидание всего (бесконечного) потока, прежде чем он вернется.

Даже если я установил базовый дескриптор файла неблокирующим с помощью fnctl, файл-объект urllib2 все еще блокирует !! В общем, кажется, что нет способа создать файловые объекты pythonпосле read вернуть все доступные данные, если они есть, и заблокировать в противном случае.

Я видел несколько сообщений о людях, которые ищут помощь в этом, но я не видел решений.Что дает?Я что-то пропустил?Это похоже на такой нормальный вариант использования, чтобы полностью разрушить!Я надеюсь использовать способность urllib2 обнаруживать настроенные прокси и использовать чанкованное кодирование, но не могу, если оно не будет взаимодействовать.

Редактировать: По запросу приведен пример кода

Клиент:

connection = urllib2.urlopen(commandpath)
id = connection.readline()

Теперь предположим, что сервер использует кодирование передачи по частям, и записывает один поток в поток, и этот фрагмент содержит строку, а затем ожидает.Соединение все еще открыто, но у клиента есть данные, ожидающие в буфере.

Я не могу получить read или readline, чтобы вернуть данные, которые, как я знаю, ожидают его, потому что он пытается читать доконец связи.В этом случае соединение может никогда не закрыться, поэтому оно будет ждать либо навсегда , либо до истечения времени ожидания бездействия, разрывающего соединение.Как только соединение разорвано, оно вернется, но это явно не то поведение, которое мне нужно.

1 Ответ

1 голос
/ 15 октября 2010

urllib2 работает на уровне HTTP, который работает с полными документами.Я не думаю, что есть способ обойти это без взлома исходного кода urllib2.

Что вы можете сделать, это использовать обычные сокеты (в этом случае вам придется самостоятельно говорить по HTTP) и вызыватьsock.recv(maxbytes), который читает только доступные данные.

Обновление : вы можете попытаться вызвать conn.fp._sock.recv(maxbytes) вместо conn.read(bytes) в соединении urllib2.

...