Что такое событийная машина

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

В основе любой событийной машины лежит цикл событий. Машина открывает несколько потоков данных для приема сигналов, и по циклу отслеживает поступление вызовов. Как только фиксируется событие ввода/вывода, машина передает управление участку кода, отвечающему за обработку произошедшего события. Обычно машина работает в режиме невытесняющей многозадачности: т.е. в один момент времени ведется обработка только одного события. Обработка следующего события не начнется до тех пор, пока предыдущий обработчик не завершит свою работу. Таким образом, "зависание" обработки одного события приводит к блокировке всей системы.

Цитата с форума forum.vingrad.ru:

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

Если использовать событийную машину, то алгоритм будет таким: открываем сокет к первому серверу в неблокируемом режиме (не дожидаясь соединения) и создаем функцию-обработчик записи в сокет, открываем сокет ко второму серверу в неблокируемом режиме и создаем функцию-обработчик записи в сокет, создаем таймер для завершения обработки по истечении таймаута (можно задать отдельные таймеры для каждого соединения, по желанию). Запускаем цикл обработки событий.

После установления соединения с одним из серверов будет вызвана соответствующая функция-обработчик. Например, для первого сервера. Внутри этой функции мы выполняем запрос к удаленному серверу и создаем функцию-обработчик чтения из сокета, после завершения функции-обработчика записи управление передается обратно в цикл обработки событий (во время выполнения функции-обработчика другие события не обрабатываются, т.к. у нас один поток выполнения).

После ответа первого сервера на наш запрос вызывается функция-обработчик для чтения, в которой мы получаем данные из сокета и сохраняем их (или обрабатываем). После получения всех данных закрываем соединение. Функция-обработчик чтения вызывается по мере получения данных от сервера многократно. После получения всех данных от сервера закрываем соединение. После закрытия всех соединений
(или срабатывания таймера) завершаем цикл обработки сообщений.

POE - это событийная машина Perl.

Кроме POE, существуют и другие perl-модули, которые позволяют организовать работу событийной машины: EV, Event, AnyEvent.

Полезные ссылки

gorinich.net: Событийная машина POE и сетевая многозадачность
forum.vingrad.ru: Perl и потоки?
ru.wikipedia.org: Событийно-ориентированное программирование