工人和主管elixir应用程序之间的区别

rkm*_*max 6 elixir phoenix-framework

我是elixir/phoenix的新手.我正在开发一个以前创建的具有多个存储库的应用程序,今天我看到一个让我想知道配置意味着什么的示例

我想我不知道如何搜索这就是我无法在文档上找到正确答案的原因

首先,我正在工作的应用程序有类似的东西

defmodule RestApi do
  use Application

  def start(_type, _args) do
    import Supervisor.Spec, warn: false

    children = [
      supervisor(RestApi.Endpoint, []),
      supervisor(RestApi.Repo, []),]),
      supervisor(RestApi.OtherRepo, []),]),
    ]

    opts = [strategy: :one_for_one, name: RestApi.Supervisor]
    Supervisor.start_link(children, opts)
  end

  def config_change(changed, _new, removed) do
    RestApi.Endpoint.config_change(changed, removed)
    :ok
  end
end
Run Code Online (Sandbox Code Playgroud)

他们使用Supervisor.Spec.supervisor/3函数来启动/管理所有内容

后来我找到了一个例子

defmodule RestApi do
  use Application

  def start(_type, _args) do
    import Supervisor.Spec, warn: false

    children = [
      supervisor(RestApi.Endpoint, []),
      worker(RestApi.Repo, []),
    ]

    opts = [strategy: :one_for_one, name: RestApi.Supervisor]
    Supervisor.start_link(children, opts)
  end

  def config_change(changed, _new, removed) do
    RestApi.Endpoint.config_change(changed, removed)
    :ok
  end
end
Run Code Online (Sandbox Code Playgroud)

示例中,他们使用Supervisor.Spec.worker/3来启动/管理仓库

这有什么区别?我的意思是如何影响应用程序(性能,内存消耗等)

Ale*_*kin 10

认为主管是监督树中的一个分支,而工人是一个叶子.

每个supervisor都是一个worker,而不是每个worker都是一个supervisor.虽然它supervisor具有一系列专门用于管理子流程的功能,但实际上与通用相比,它对生产力的影响非常小gen_server.OTP设计原则的摘录解释了supervisor应该是什么:

主管负责启动,停止和监控其子进程.主管的基本思想是通过在必要时重新启动它们来保持其子进程的活跃性.
要启动和监视的子进程由子规范列表指定.子进程按此列表指定的顺序启动,并以相反的顺序终止.

除此之外,它是" worker.".

也就是说,有一个易于采用的经验法则:当流程管理子流程时,它就是a supervisor,否则就是其中之一worker.

在上面提到的例子中:

children = [
  supervisor(RestApi.Endpoint, []),
  worker(RestApi.Repo, []),
]
Run Code Online (Sandbox Code Playgroud)

RestApi.Endpoint管理子流程,而RestApi.Repo不是.除此之外,两者都是平淡无奇的好事gen_server.