POE - portable multitasking and networking framework for Perl.

31 июля 2007 12:54
Tags: Perl, POE
 
А по-русски, платформонезависимый фреймворк для создания многозадачных и сетевых приложений на Perl.

POE позволяет достаточно просто и быстро создавать многозадачные приложения, особо не задумываясь об управлении процессами и другими приятными вещами, с которыми приходится сталкиваться при желании написать многозадачное приложение. Всю эту нагрузку на себя берет POE, мы лишь описываем, что мы хотим делать. В большинстве случаев все приложение выполняется одним процессом, но при необходимости, POE умеет порождать дочерние процессы и общаться с ними.

Но при всем при этом есть момент, который нельзя выпускать из виду при разработке приложений на POE. POE обеспечивает невытесняющую многозадачность. Это значит, что активное событие выполняется до тех пор, пока оно само, по собственной инициативе, не отдаст управление ядру для того, чтобы оно выбрало из очереди другое, готовое к выполнению событие. Такой механизм применялся в Windows 9x. Недостатком такого подхода является то, что если некоторое событие зациклится, это приведет к краху всей системы. (Некоторые компоненты POE умеют так делать, но это уже другая история.)

Основными модулями POE являются ядро POE::Kernel и сессия POE::Session. Ядро контролирует очередь событий и их вызов, собственно ядро и обеспечивает всю многозадачность. Сессия – это абстрактная событийная машина. Каждую сессию можно рассматривать как самостоятельное приложение, которое имеет свой набор методов и свою абстрактную память. Посредством ядра сессии могут общаться между собой.

Рассмотрим простейший пример из документации:
#!/usr/bin/perl -w
use strict;
use POE;

for (1..10) {
	POE::Session->create(
		'inline_states' => {
			'_start'    => sub {
				print "Session ", $_[SESSION]->ID, " has started.\n";
				$_[HEAP]->{'count'} = 0;
				$_[KERNEL]->yield('increment');
			},
			'increment' => sub {
				print "Session ", $_[SESSION]->ID, " counted to ", ++$_[HEAP]->{'count'}, ".\n";
				$_[KERNEL]->yield('increment') if $_[HEAP]->{'count'} < 10;
			},
			'_stop'     => sub {
				print "Session ", $_[SESSION]->ID, " has stopped.\n";
			},
		}
	);
}

POE::Kernel->run;
В этом примере сначала создается 10 сессий, после чего происходит запуск ядра. Сессия также может быть создана и во время работы ядра. Также сессия может быть создана внутри другой сессии, такая сессия называется дочерней. Методы сессии описываются в параметре inline_states. Это хеш, в котором в качестве значений используются либо ссылки на функции либо анонимные процедуры. Для каждой сессии «выделяется область памяти», с которой работает только эта сессия. По сути это простая переменная в которой сессия может хранить что угодно. Эта переменная называется HEAP, при создании сессии можно задать ее начальное значение в параметре heap, внутри любого метода сессии к ней можно получить доступ через $_[HEAP]. Как только ядро обнаруживает новую сессию, оно выполняет метод _start. Как только ядро считает, что сессия больше не потребуется и ее никто не будет вызывать, вызывается метод _stop, после чего сессия уничтожается. В каждый момент времени выполняется только один метод. Как только выполнение метода заканчивается, управление возвращается ядру и оно выполняет вызов следующего события из очереди. Также любой метод может поставить в очередь ядра любое событие своей или чужой сессии. Обращение к ядру осуществляется через $_[KERNEL]. Чтобы поставить сообщение в очередь существует множество методов ядра. Но наиболее употребительные это yield (постановка в очередь события своей сессии), post (постановка в очередь события любой сессии), call (синхронный вызов события любой сессии), delay (просьба вызвать метод своей сессии через определенный промежуток времени).

Это был краткий обзор POE. В следующих статьях я постараюсь описать некоторые компоненты POE. А пока с удовольствием отвечу на любые вопросы.

Полную документацию и примеры использования можно найти на сайте http://poe.perl.org/. Информация на русском языке по POE практически отсутствует.

PS. POE – единственный фреймворк, который поддерживает графические инструменты Tk и Gtk. Что позволяет писать на Perl многозадачные оконные приложения.
В закладки: Запомнить эту страницу В МоёМесто Забобрить Delicious Digg Добавить новость на МойКруг
Имя*:
E-mail*:
Сайт:
Сообщение*:

Теги

Страницы

Ссылки

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

Друзья

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

META

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