Эликсир: разница между Supervisor, GenServer и Приложением - PullRequest
0 голосов
/ 18 ноября 2018

Я практиковался с этим примером.
https://github.com/kwmiebach/how-to-elixir-supervisor

Я следовал инструкции и получил представление о том, как она работает, но не могу понять, насколько Supervisor, GenServer и Application точно отличаются друг от друга.

Может кто-нибудь объяснить, как эти 3 отличаются и когда их следует использовать?

1 Ответ

0 голосов
/ 18 ноября 2018

Прежде всего, это все «Принципы разработки OTP» (и поддерживаемые стандартной библиотекой), все они являются обертками (или, лучше сказать, абстракциями) поверх базовых примитивов Erlang, таких как процессы. Это означает, что они не единственный способ программирования на Erlang (отсюда и Elixir), но они используются сообществом и поддерживаются десятилетиями проверенных в бою реальных систем. Таким образом, вы должны использовать их тоже.


GenServer обычно считается базовым строительным блоком runtime для приложений, реализованных с помощью Elixir. Хотя на самом деле это оболочка для низкоуровневых примитивов Erlang Process, тем не менее, GenServer предоставляет множество расширенных функций, таких как отладка и трассировка в стандартном интерфейсе. Как правило, вы обычно используете (много) GenServer для управления состоянием и «выполняете реальную работу» в своем приложении.


Supervisor, как следует из документации :

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

Таким образом, в некотором смысле он «управляет» GenServer с, но также и другими Supervisor с (и другими абстракциями процесса Эрланга, если они реализуют надлежащий интерфейс). Обычно вы не добавляете никакой пользовательской логики в модули Supervisor, отчасти потому, что их роль очень сфокусирована - просто управляйте жизненными циклами дочерних процессов. Но также сделать его менее подверженным ошибкам (вносимым вашими изменениями).

Скажем по-другому, Supervisor не выполняет никакой "работы" для вашего приложения, он просто используется для "разметки" архитектуры системы.


По сравнению с другими, Application - это , а не - это обязательно "проблема времени выполнения", , как предполагает документация Erlang :

... превратить код в приложение, то есть компонент, который можно запускать и останавливать как единое целое, а также можно повторно использовать в других системах.

Таким образом, Application на самом деле предназначен для объединения вещей в «модуль», и реальные системы обычно состоят из множества таких модулей - например, когда вы запускаете некоторый код Elixir, есть также "elixir" Application, который запускает несколько процессов, таких как как elixir_code_server:

Elixir Runtime

Что еще более важно, Application - это способ использовать (повторно использовать) код в принципах разработки OTP. Когда вы определяете приложение, оно может иметь «корневой супервизор», который запускается вместе с приложением. Или он также может иметь только функциональные коды без каких-либо процессов, например, библиотека JSON . В любом случае, для повторного использования кода в разных системах их необходимо упаковать в Application s.


Наконец, я бы предложил прочитать это: https://ferd.ca/the-zen-of-erlang.html он объяснил (по крайней мере для меня), как мы переходим от базовых (Erlang) процессов к супервизорам (и дереву надзора), и немного OTP-приложений. (И как мы должны подходить к программированию в BEAM)

...