Введение

вариант Mach

Perl Object Environment (POE) — это библиотека модулей Perl, написанная на языке программирования Perl Рокко Капуто и др. Согласно CPAN:
"POE изначально разрабатывался как ядро постоянного объектного сервера и среды выполнения. Он эволюционировал в универсальную многозадачную и сетевую платформу, включающую в себя и предоставляющую согласованный интерфейс для других циклов обработки событий, таких как Event, а также инструментариев Tk и Gtk."

Архитектура 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.

Вводно-выводной слой

Следующее требование ядра — это обработчики ввода-вывода, существующие в едином 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 следующего уровня.

Поэтический юмор

Модуль Acme::POE::Knee на CPAN. Несколько нелепых расшифровок аббревиатур в конце раздела "Что такое POE".