2014-01-04 5 views
5

Я использовал поведение супервизора и gen_server, и я могу понять практическое использование для них обоих. Тем не менее, я действительно не понимаю использование gen_fsm и поведения gen_event. Может ли кто-нибудь прояснить практические примеры?OTP-поведение: gen_fsm; gen_event. Практические примеры?

Заранее спасибо

ответ

4

Одним из классических примеров для FSM будет замок с тайм-аут, который упоминается в руководстве,

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

Пример события протоколирования используется в https://github.com/basho/lager

+0

Спасибо. Почему команда lager решила использовать gen_event вместо gen_server? –

+2

From Manual, так как каждый обработчик событий является одним модулем обратного вызова, диспетчер событий будет иметь несколько модулей обратного вызова, которые будут добавлены и удалены динамически. Поэтому gen_event более терпим к ошибкам модуля обратного вызова, чем к другим видам поведения. Если функция обратного вызова для установленного обработчика событий не работает с Reason или возвращает значение с плохим значением, менеджер событий не будет терпеть неудачу. Он удалит обработчик события, вызвав функцию обратного вызова Module: terminate/2 (см. Ниже), в качестве аргумента {error, {'EXIT', Reason}} или {error, Term}, соответственно. Никакой другой обработчик событий не будет затронут. – Marutha

2

gen_fsm является аккуратной реализацией конечного автомата, вы тростниковый сделать примерно то же самое, что вы делаете с gen_server, а кроме того легко управлять различными состояниями ваше приложение (например, в игровом сервере выберите уровень, таблицу, измените атрибут игрока, воспроизведите, сохраните, восстановите ...).

gen-event - это простой способ для отправки события, ваше приложение отправляет все события gen_event, ничего не зная о потенциальном использовании, и вы динамически добавляете и удаляете обработчики с различным поведением (файл входа в базу данных, отображение информация в графическом интерфейсе ...). Я использовал это, чтобы иметь графическое представление состояния процессов и связи моего приложения и журнала файлов для анализа производительности.

3

Некоторые хорошие примеры вы можете найти их здесь:

"Event handlers" и "Finite State Machines"

gen_fsm:

Поведение gen_fsm несколько похожа на gen_server в том, что это специализированной версии. Самое большое различие заключается в том, что вместо , чем обработка вызовов и отбрасываний, мы обрабатываем синхронные и асинхронные события . Как и наши примеры с собакой и кошкой, каждое состояние представлено функцией. Опять же, мы рассмотрим обратные вызовы, которые должны быть реализованы для работы модулей .

gen_event:

gen_event поведение отличается совсем немного от gen_server и gen_fsm поведения в том, что вы действительно никогда не начиная процесс. Поведение gen_event в основном запускает процесс, который принимает, и вызывает функции, и вы предоставляете только модуль с этими функциями. Это означает, что вы не имеете никакого отношения к событиям манипуляции, кроме как дать свои функции обратного вызова в формате, который радует менеджера событий. Все управление осуществляется бесплатно; вы только укажите, что конкретно подходит вашему приложению. На самом деле это не удивительно, учитывая, что OTP - это все, что касается разделения того, что общего от конкретного.

Смежные вопросы