我正在用这个例子练习。
https://github.com/kwmiebach/how-to-elixir-supervisor
我按照指示进行了操作,但是我无法理解Supervisor,GenServer和Application之间的确切区别。
有人可以解释这三种不同之处以及何时使用吗?
答案 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
:
更重要的是,Application
是在OTP设计原则中共享(重用)代码的方式。定义应用程序时,它可以具有“ root超级用户”,该超级用户与应用程序一起启动。或者它也可以仅具有功能代码,而根本不运行任何进程,例如a JSON library。无论哪种方式,要在不同系统之间重用代码,都需要将它们打包到Application
中。
最后,我建议读一读:https://ferd.ca/the-zen-of-erlang.html它(至少对我而言)解释了我们如何从基本(Erlang)过程转变为主管(和监督树),以及一些OTP应用程序。 (以及我们应该如何在BEAM中进行编程)