Введение
вариант Mach
Perl Object Environment (POE) — это библиотека модулей Perl, написанная на языке программирования Perl Рокко Капуто и др. Согласно CPAN:
"POE изначально разрабатывался как ядро постоянного объектного сервера и среды выполнения. Он эволюционировал в универсальную многозадачную и сетевую платформу, включающую в себя и предоставляющую согласованный интерфейс для других циклов обработки событий, таких как Event, а также инструментариев Tk и Gtk."
"POE originally was developed as the core of a persistent object server and runtime environment. It has evolved into a general purpose multitasking and networking framework, encompassing and providing a consistent interface to other event loops such as Event and the Tk and Gtk toolkits."
Архитектура POE: слои абстракции
POE, Perl Object Environment можно рассматривать как крошечную модульную операционную систему. Один или несколько экземпляров или программ POE могут выполняться параллельно и обычно хорошо подходят для кооперативной многозадачности. Пакет POE состоит из пространств имен и абстракций, которые определяют дальнейшее развитие POE в соответствии с открытыми соглашениями, принятыми в CPAN.
Слой событий
Неформальная архитектура состоит из набора слоев с ядром в основании. Это крошечное ядро представляет собой слой событий, функционирующий как основной цикл каждого запущенного экземпляра POE. Первый вызов направлен к "диспетчеру событий" POE::Kernel. Пространство имен POE::Kernel содержит набор функций, подключаемых непосредственно к ядру. Эти абстракции циклов разработаны на основе стандартизированного интерфейса событийного моста POE::Loop. Их можно комбинировать по мере необходимости для обеспечения сервисов времени выполнения и эффективного механизма межпроцессного взаимодействия. Основные функции: POE::Loop::Event, POE::Loop::Poll и POE::Loop::Select. Также доступны POE::Loop::Tk и POE::Loop::Gtk, предоставляющие точки подключения к другим мостам циклов во внешней среде. Если этого недостаточно, абстракция ядра POE::Loop обеспечивает повторное использование обратных вызовов сигналов, обратных вызовов времени или таймеров, обратных вызовов активности файловых дескрипторов, а также административные функции, такие как инициализация, выполнение и завершение циклов событий. Существует также высокоуровневый фреймворк упаковки POE::Macro и утилита отладки для их тестирования – POE::Preprocessor. Этот фреймворк породил POE::Macro::UseBytes. ПРИМЕЧАНИЕ: В соответствии с традицией Perl, POE также является развивающейся системой. Всегда проверяйте CPAN, чтобы узнать, какие новые возможности добавило сообщество в архив. (и помните девиз Perl: "Есть больше одного способа сделать это", по словам Ларри). Работающее ядро функционирует посредством примитивных конечных автоматов, построенных на основе другого набора абстракций, управляемых архитектурой POE::Session. POE::Session почти тривиально определяется как отображение событий на функции, методы классов и/или методы объектов, которые их обрабатывают. Объекты POE::Session также содержат область хранения, общую для всех обработчиков событий, называемую кучей. Как бы вы ни рассматривали их, состояния чётко идентифицированы и определены. Более функциональным обработчиком событий является подкласс POE::Session под названием POE::NFA – недетерминированный конечный автомат, управляемый событиями (более продвинутый конечный автомат). Этот обработчик событий переходит из одного строго определённого состояния в другое по мере необходимости, в зависимости от событий, опросов, выбора пользователя или других внешних воздействий. Этот конечный автомат позволяет инкапсулировать широкий спектр общих потоков, управляемых событиями, обеспечивая более точное отслеживание пути выполнения по сравнению с относительно неформальным POE::Session.
The Running Kernel operates through primordial finite state machines constructed from another set of abstractions ruled by the POE::Session architecture. A POE::Session is almost trivially defined as a map of events to the functions, class methods, and/or object methods that handle them. POE::Session objects also contain a storage space shared by all its event handlers, called a heap. Any way you slice them the states are solidly identified and clearly defined. A more featureful event handler is a POE::Session subclass called POE::NFA an event driven Nondeterministic finite automaton (a smarter finite state machine). This event handler moves from one strictly defined state to another as events, polls, user selections, or other external events require. This state machine acts to encapsulate a wide range of generic event driven threads allowing much tighter tracking along the execution path than the relatively informal POE::Session.
Вводно-выводной слой
Следующее требование ядра — это обработчики ввода-вывода, существующие в едином I/O-уровне, называемом Wheels (Колеса). Wheels инициируют действия, обрабатывают возникающие низкоуровневые события и генерируют события более высокого уровня для сессий, которые их используют. Как и Сессии и Циклы, Wheels построены на основе единого набора абстракций POE::Wheel, которые располагаются поверх ядра. В базовой поставке POE имеется семь высокоспециализированных и чётко определенных Wheels:
POE::Wheel::Run — создает и взаимодействует с дочерними процессами, используя каналы (pipes), fork и иногда exec. Взаимодействие осуществляется через стандартный ввод и вывод дочернего процесса. POE::Wheel::SocketFactory — предоставляет способ создания клиентских и серверных сокетов без блокировки в ожидании их установления. POE::Wheel::Curses — обработчик неблокирующего ввода из библиотеки текстового интерфейса Curses. Такие компоненты CPAN, как Curses::UI::POE и Term::Visual, построены на его основе. POE::Wheel::FollowTail — отслеживает постоянно растущий файл, например, журнал или общий документ, удерживая дескриптор в конце файла. POE::Wheel::ListenAccept — подмножество POE::Wheel::SocketFactory, используемое для прослушивания существующих серверных сокетов и принятия соединений от удаленных клиентов. POE::Wheel::ReadLine — неблокирующий, управляемый событиями аналог Term::ReadLine. POE::Wheel::ReadWrite — высокопроизводительный NBIO-обработчик файлов для POE, использующий драйверы и фильтры POE для выполнения буферизированного чтения и записи в файловые дескрипторы, опирающийся на файловую систему POE следующего уровня.
POE::Wheel::Run Creates and interacts with child processes using pipe , fork , and sometimes exec Interaction is done through the child's standard input and output. POE::Wheel::SocketFactory A way to create client and server sockets without blocking to wait for their establishment. POE::Wheel::Curses A handler for non blocking input from the Curses text interface library. CPAN components such as Curses::UI::POE and Term::Visual build upon it. POE::Wheel::FollowTail Tracks an ever growing file, such as a log or a collaborative document, by keeping a handle on its tail. POE::Wheel::ListenAccept A subset of POE::Wheel::SocketFactory used for listening on existing server sockets and accepting connections from remote clients. POE::Wheel::ReadLine A non blocking, event driven analogue to Term::ReadLine. POE::Wheel::ReadWrite A high performance NBIO file handler for POE that uses POE's drivers and filters to perform buffered read and write on filehandles which draws on the next layer POE's own little file system.
Поэтический юмор
Модуль Acme::POE::Knee на CPAN. Несколько нелепых расшифровок аббревиатур в конце раздела "Что такое POE".