Elixir:Supervisor,GenServer和应用程序之间的区别

时间:2018-11-18 07:52:06

标签: elixir supervisor

我正在用这个例子练习。
https://github.com/kwmiebach/how-to-elixir-supervisor

我按照指示进行了操作,但是我无法理解Supervisor,GenServer和Application之间的确切区别。

有人可以解释这三种不同之处以及何时使用吗?

1 个答案:

答案 0 :(得分:3)

首先,这些都是“ OTP设计原则”(并得到标准库的支持),它们都是在基本的Erlang原语(如流程)之上的包装(或更好的抽象)。这意味着它们不是 唯一的用Erlang编程的方法(因此称为Elixir),但它们是社区共享的,并得到了数十年久经考验的真实系统的支持。因此,您也应该使用它们。


GenServer通常被认为是使用Elixir实现的应用程序的基本 runtime 构建块。尽管实际上它是低级Erlang Process原语的包装,但是GenServer提供了许多高级功能,例如在标准接口中进行调试和跟踪。基本上,您通常会使用(许多)GenServer来管理状态并“完成实际工作”。


Supervisor, as the documentation suggests

  

主管是对其他流程进行监督的流程,我们将其称为子流程。主管用于构建称为监督树的分层过程结构。

因此,从某种意义上说,它“管理” GenServer,还“管理”其他Supervisor(以及其他Erlang Process抽象,如果它们实现了适当的接口)。通常,您不会在Supervisor模块中放置任何自定义逻辑,部分原因是它们的作用非常集中-只管理子进程的生命周期。而且还可以减少错误的发生(由更改引起)。

用另一种方式说,Supervisor并没有为您的应用程序做任何实际的“工作”,它只是用来“布局”系统的体系结构。


与其他相比,Application 不一定不一定是“运行时问题”,as the Erlang documentation suggests

  

...将代码放入应用程序中,即可以作为一个单元启动和停止的组件,也可以在其他系统中重用

所以Application实际上是将东西捆绑成一个“单元”,实际的系统通常由许多这样的单元组成-例如,每当您运行一些Elixir代码时,也会有一个"elixir" Application运行多个进程,例如elixir_code_server

Elixir Runtime

更重要的是,Application是在OTP设计原则中共享(重用)代码的方式。定义应用程序时,它可以具有“ root超级用户”,该超级用户与应用程序一起启动。或者它也可以仅具有功能代码,而根本不运行任何进程,例如a JSON library。无论哪种方式,要在不同系统之间重用代码,都需要将它们打包到Application中。


最后,我建议读一读:https://ferd.ca/the-zen-of-erlang.html它(至少对我而言)解释了我们如何从基本(Erlang)过程转变为主管(和监督树),以及一些OTP应用程序。 (以及我们应该如何在BEAM中进行编程)