как делать асинхронные HTTP-запросы с epoll и python 3.1

ОБНОВЛЕНИЕ: после долгой работы с Py3, в том числе написания моего собственного асинхронного веб-сервера (после презентации Дэйва Бизли), я наконец выбросил Python (и огромный стек моего кода) -: в пользу CoffeeScript, работающий на NodeJS. Проверьте это: GitHub (где в наши дни вы найдете около 95% всего интересного кода), npm (менеджер пакетов, который не может быть удобным для пользователя; избавление от дороги, easy_install, вы никогда не оправдали своего имени), безумно огромный репозиторий модулей (с множеством новых материалов, публикуемых практически 24/7), огромное и яркое сообщество, асинхронный HTTP и обработка файлов ... и все такое (спасибо V8) на треть скорости света - что может не понравиться? прочитайте больше пропаганды: «Будущее сценариев» (предоставлено хостингом слайдов SpreeWebdesign).

есть интересная страница http://scotdoyle.com/python-epoll-howto.html о том, как выполнять асинхронное / неблокирующее / AIO http-обслуживание в python 3.

существует веб-сервер tornado, который включает неблокирующий http-клиент. мне удалось перенести части сервера на python 3.1, но для реализации клиента требуются pyCurl и < a href = "http://groups.google.com/group/python-tornado/browse_thread/thread/276059a076593266/c49e8f834497271e?lnk=gst&q=httpclient+trouble+with+epoll#c49e8f834497271e" nikea иметь проблемы (один участник заявил, что «Libcurl - это такая головная боль», и, глядя на невероятно уродливую страницу pyCurl, я сомневаюсь, что pyCurl появится в py3 + в ближайшее время).

Теперь, когда epoll доступен в стандартной библиотеке, должна появиться возможность выполнять асинхронные HTTP-запросы прямо из коробки с помощью python. я действительно не хочу использовать asyncore или еще много чего; epoll имеет репутацию идеального инструмента для решения этой задачи, и он является частью дистрибутива Python, поэтому использование чего-либо, кроме epoll для неблокирующего http, крайне нелогично (докажите, что я ошибаюсь, если вам это нравится).

о, и я чувствую, что резьба ужасна. нет резьбы. я использую stackless.

люди, которые интересуются темой асинхронного http, не должны пропустить это выступление Питера Портанте на PyCon2010; также представляет интерес основной доклад, в котором докладчик Антонио Родригес на один момент подчеркивает важность наличия современных библиотек веб-технологий прямо в стандартной библиотеке.

edit может быть много способов добиться высокой пропускной способности при небольшом потреблении ресурсов. однако не только я считаю, что отказ от потоков (и других, частично устаревших, методов); похоже, что люди из проекта google skipfish думают так же: они говорят, что skipfish использует

Мультиплексирование однопоточной, полностью асинхронной сетевой модели ввода-вывода и обработки данных, которая устраняет неэффективность управления памятью, планирования и IPC, присущую некоторым многопоточным клиентам.


person flow    schedule 22.03.2010    source источник


Ответы (4)


FWIW, у меня есть библиотека по адресу: http://github.com/mnot/nbhttp/

Клиентская часть находится в разработке как часть redbot.org.

Я не пробовал его в Python 3, но он может помочь в вашей работе.

Ваше здоровье,

person Mark Nottingham    schedule 14.04.2010

В этом опросе, несколько месяцев назад, Джампаоло Родола сказал

У меня есть патч для добавления поддержки epoll (), который почти готов (asyncore поддерживает poll (), а не epoll ()), это просто вопрос написания тестов.

Я не уверен, где найти этот патч, но это кажется достаточно простой задачей, чтобы его можно было легко перенести в asyncore (подход стандартной библиотеки Python к асинхронным серверам и клиентам - конечно, далеко позади Twisted или Tornado, но это то, что в stdlib есть ;-).

person Alex Martelli    schedule 22.03.2010
comment
да, но epoll тоже находится в стандартной библиотеке ... и, как указали некоторые пользователи (например, bytes.com/topic/python/answers/29901-asyncore-deficiencies), асинкор может быть неприятным. я действительно остановился на epoll ... - person flow; 22.03.2010

Circuits поддерживает epoll и включает клиента async) # 50.

http://circuitsframework.com/

person James Mills    schedule 03.03.2013

В Python 3 отсутствуют библиотеки. Кажется, вам интересны библиотеки, которые помогут вам в этом, так почему именно вы используете Python 3 для решения своей проблемы?

person nosklo    schedule 24.03.2010
comment
python 3 - это будущее! ;-) на самом деле стандартная библиотека Python 3 немного лучше, чем у серии 2.x. с точки зрения языка внесено много улучшений; среди них - разумное решение проблем с кодировкой строк. с этим большинство головных болей при кодировании просто исчезли! Я предполагаю, что использование python 2 будет широко распространенным явлением, например, python 1.5.x часто застревает, а Internet Explorer 6 сильно застревает. На самом деле я просто создаю часть межпроцессного взаимодействия, поэтому я могу запускать некоторые вещи под python 2.6 и некоторые вещи под 3.1 ... но делать это правильно в 3.1 было бы намного лучше! - person flow; 25.03.2010
comment
@flow: Все улучшения в кодировке строк перенесены на версию 2.6, так что это небольшое улучшение - вы можете просто from __future__ import unicode_literals и все! Фактически, большинство улучшений было перенесено, и вы теряете библиотеки, поэтому пока что py3 - это скорее боль, чем улучшение. Возможно, они добавят что-нибудь, чтобы привлечь людей к py3 в будущем, но улучшений пока недостаточно, чтобы компенсировать проблемы с обновлением. - person nosklo; 26.03.2010
comment
Python 2.x прекратил разработку, а это означает, что запускать какой-либо проект в этой ветке крайне не рекомендуется. кроме этого, я рекомендую сейчас перейти на NodeJS - см. мою презентацию в обновлении моего вопроса. - person flow; 19.01.2012
comment
@flow: Тот факт, что он прекратил официальную разработку, не означает, что его не рекомендуется использовать. Настоятельно рекомендуется, когда он решает вашу проблему и имеет то, что вам нужно. Я бы не советовал что-то вроде того, что вы должны все написать и переписать с нуля, потому что есть новая версия языка. Кажется наоборот, даже если номер языковой версии выше. На самом деле, номер версии не имеет большого значения при принятии решения о целесообразности чего-либо. Тем не менее, разработка python 2.x продолжается над новой более быстрой реализацией под названием pypy. - person nosklo; 20.01.2012