как процессы erlang связаны с поведением gen

Я хотел бы знать, как процессы erlang связаны с поведением gen (gen_server, gen_fsm, gen_event). Например, является ли gen_server отдельным процессом, группой процессов или они не имеют отношения ко всем?


person Sajith Dilshan Jamal    schedule 16.01.2014    source источник


Ответы (3)


Поведение разных поколений по-разному относится к процессам. gen_server и gen_fsm имеют по одному процессу на каждый экземпляр (у вас может быть несколько процессов, выполняющих один и тот же код gen_server). Принимая во внимание, что gen_event выполняет обратные вызовы handle_event синхронно в контексте вызывающего процесса (gen_event:call) или асинхронно в контексте процесса диспетчера событий (gen_event:notify).

Поведение gen предназначено для того, чтобы абстрагироваться от параллелизма и использовать процессы для достижения этой цели. То, как они это делают, и есть ли отношение 1:1 между процессами и поведением gen, зависит от реализации фактического поведения gen.

person Peer Stritzinger    schedule 16.01.2014
comment
Менеджер событий — это один процесс, и обработчики gen_event запускаются в этом процессе независимо от того, кем было сгенерировано событие — gen_event:notify или gen_event:call. Это похоже на gen_server:call и gen_server:cast. - person rvirding; 16.01.2014

Такое поведение, как gen_server, представляет собой отдельный процесс Erlang, выполняющий рекурсивный вызов функции, в котором сохраняется состояние поведения. См. мой ответ на Поведение Erlang/OTP для новичков, чтобы узнать больше.

person Steve Vinoski    schedule 16.01.2014

gen_server — это «поведение». Это некоторое соглашение о структуре модуля. Какие функции доступны в модуле, каковы сигнатуры этих функций, какие значения они могут возвращать и т.д.

Архитектура otp предполагает, что некоторые процессы выполняются на этих модулях.

Таким образом, мы можем сказать, что определенный процесс является gen-сервером, если он работает на модуле с поведением gen_server и был запущен функцией, предназначенной для запуска gen_server (start() или start_link()).

person Odobenus Rosmarus    schedule 16.01.2014