Я хотел бы знать, как процессы erlang связаны с поведением gen (gen_server, gen_fsm, gen_event). Например, является ли gen_server отдельным процессом, группой процессов или они не имеют отношения ко всем?
как процессы erlang связаны с поведением gen
Ответы (3)
Поведение разных поколений по-разному относится к процессам. gen_server
и gen_fsm
имеют по одному процессу на каждый экземпляр (у вас может быть несколько процессов, выполняющих один и тот же код gen_server
). Принимая во внимание, что gen_event
выполняет обратные вызовы handle_event синхронно в контексте вызывающего процесса (gen_event:call
) или асинхронно в контексте процесса диспетчера событий (gen_event:notify
).
Поведение gen предназначено для того, чтобы абстрагироваться от параллелизма и использовать процессы для достижения этой цели. То, как они это делают, и есть ли отношение 1:1 между процессами и поведением gen, зависит от реализации фактического поведения gen.
gen_event:notify
или gen_event:call
. Это похоже на gen_server:call
и gen_server:cast
.
- person rvirding; 16.01.2014
Такое поведение, как gen_server
, представляет собой отдельный процесс Erlang, выполняющий рекурсивный вызов функции, в котором сохраняется состояние поведения. См. мой ответ на Поведение Erlang/OTP для новичков, чтобы узнать больше.
gen_server — это «поведение». Это некоторое соглашение о структуре модуля. Какие функции доступны в модуле, каковы сигнатуры этих функций, какие значения они могут возвращать и т.д.
Архитектура otp предполагает, что некоторые процессы выполняются на этих модулях.
Таким образом, мы можем сказать, что определенный процесс является gen-сервером, если он работает на модуле с поведением gen_server и был запущен функцией, предназначенной для запуска gen_server (start() или start_link()).