Событийная машина POE и сетевая многозадачность.

24 сентября 2007 1:01
Tags: perl, poe, многопоточность, событийная машина
 
Что такое событийная машина POE я кратко рассказывал в одной из предыдущих заметок.
Под сетевой многозадачностью будем понимать параллельную обработку входящих и/или исходящих сетевых соединений системными, либо прикладными приложениями.

Почему именно POE? Вопрос, конечно, требующий обоснования. Для начала рассмотрим какие вообще бывают способы обеспечения многозадачности. Я знаю три
  • параллельные процессы
  • событийные машины
  • многопоточность
Параллельные процессы
Это когда мы запускаем несколько экземпляров одного приложения. Например так делает Apache при обработке параллельных запросов к динамическим страницам. На каждый запрос порождается очередной процесс и обрабатывает его. Т.е. все сводится к последовательной обработке запросов большим количеством экземпляров одного приложения. Плюсы и минусы в такой ситуации очевидны:
  • простота организации (у нас нет проблем с блокировками и синхронизацией);
  • всю рутину за нас выполняет операционная система;
  • большое количество процессов требует большого количества ресурсов;
  • нет возможности динамически управлять процессом.

Событийные машины
Как устроена событийная машина? Ни для кого не секрет, что операционная система позволяет в пределах одного приложения открыть несколько потоков данных и ожидать ввода/вывода из них. В основе любой событийной машины лежит цикл событий. Этот цикл позволяет отслеживать наличие ввода/вывода на любом из открытых потоков. Как только фиксируется событие ввода/вывода, управление передается участку кода, отвечающему за обработку этого события. При такой организации есть один важный момент. Обычно событийная машина обеспечивает невытесняющую многозадачность. Поэтому необходимо следить, чтобы какое-нибудь событие не заблокировало всё приложение. А то получится как во времена Windows 9x, когда одно приложение могло заблокировать всю систему.

Многопоточность
Здесь подразумевается порождение нескольких параллельных потоков в пределах одного приложения. К плюсам можно отнести использование всеми потоками одного адресного пространства и то, что скорость порождения очередного потока намного выше скорости порождения нового процесса. К минусам можно отнести проблему синхронизации потоков, в отличие от проблемы блокирования в событийных машинах.

Программировать многопоточные приложения мне не доводилось, но имея некоторое представление о них, мне приятнее будет повозиться с блокировками. Но это уже исключительно субъективный взгляд. А с многопоточностью пусть возятся программисты на java, python и ruby. Тем более, что эти языки прямо так и просят, чтобы на них писали именно многопоточные приложения, а не событийные машины.

Perl же больше расположен к использованию событийных машин. Одной из таких машин является фреймворк POE, написанный Rocco Caputo.
Пришло время ответить на вопрос почему именно POE?
POE имеет очень хорошую абстракцию по классам. На CPAN можно найти модули практически под любые задачи. Например если нам надо организовать HTTP клиента, мы просто подключаем модуль POE::Component::Client::HTTP. Т.о. мы как из конструктора собираем приложение, которое способно выполнять поставленные задачи и нам остается только описать все необходимые события. Если Вы программируете на Perl, то писать многозадачные приложения на POE будет для Вас сплошным удовольствием. В одной из следующих заметок я обязательно расскажу, как написать простейшего сетевого бота на POE

Теперь о производительности. Приложение на POE способно обрабатывать 100-1000 запросов в секунду, а это очень не мало. Написание приложения на столь высоком уровне занимает гораздо меньше времени, чем низкоуровневая реализация. В моей практике были высоконагруженные приложения написанные на POE. Паук, написанный на POE::Component::Client::HTTP выжимал 17-20 Мбит/сек, и это в один процесс!

К моему большому сожалению, в России POE используется крайне мало. Лично я знаю всего две организации, которые использую POE в своих проектах. Это Точка Кипения и New Media Stars. Из фрилансеров могу назвать только Павла Кудинова. Кстати, 25 сентября (т.е. уже завтра), Павел будет выступать с докладом Сетевая многозадачность: событийные машины на конференции HighLoad – 2007.
В закладки: Запомнить эту страницу В МоёМесто Забобрить Delicious Digg Добавить новость на МойКруг
Имя*:
E-mail*:
Сайт:
Сообщение*:

Теги

Страницы

Ссылки

Новости XML и обзоры

Друзья

Дамочка в поиске Дамочка в поиске
Отражение в сети

META

Valid XHTML
XHTML Friends Network
RSS 2.0 Feed
Читать в Яндекс.Ленте
Add to Google
количество читателей онлайн и всего
© 2007 Gorinich.net