gpt4 book ai didi

concurrency - Elixir/Erlang 和 Cowboy - 如何使用主管

转载 作者:行者123 更新时间:2023-12-04 07:19:40 25 4
gpt4 key购买 nike

当您使用 Mix 创建应用程序时,它始终会向项目添加一个根主管文件。请注意监督函数中的“子规范”数组是如何为空的。

应用程序:

defmodule App.Supervisor do
use Supervisor

def start_link do
Supervisor.start_link(__MODULE__, :ok)
end

def init(args) do
supervise([], [strategy: :one_for_one])
end
end

还为您创建了应用程序的入口点。通过我在网上找到的一些示例,我写了以下内容:
defmodule App do
def start(_type, _args) do
dispatch = :cowboy_router.compile([
{
:_,
[
# Simple JSON test.
{"/test", app.Handle.test, []},
]
}
])

{:ok, _} = :cowboy.start_http(
:http,
100,
[{:port, 8080}],
[{ :env, [{:dispatch, dispatch}]}]
)

App.Supervisor.start_link()
end
end

这个应用程序可以工作,但如果我在 App.start() 中删除对 App.Supervisor.start_link() 的调用,它也可以工作。

那么在这种情况下,主管是做什么的?如果主管的子规范是空的,那么它的意义何在?

例如,在此处找到的 Elixir 示例中 - https://github.com/IdahoEv/cowboy-elixir-example/blob/master/lib/cowboy_elixir_example.ex - 您可以看到第 65 行注释掉了启动主管的调用。

但是在官方的 Cowboy Erlang 示例中,此文件 - https://github.com/ninenines/cowboy/blob/master/examples/hello_world/src/hello_world_app.erl - 创建一个没有子规范的类似根主管,然后在此处的主应用程序文件中调用它,第 22 行 - https://github.com/ninenines/cowboy/blob/master/examples/hello_world/src/hello_world_app.erl

最佳答案

有一个比监督树更高级的概念:application .

一个项目通常由许多应用程序组成。他们每个人都可以有自己的监督树。如果你用 wx 小部件正确安装了 Erlang 和 Elixir,你可以通过运行来查看它:

:observer.start

这将打开一个图形用户界面。转至 Applications选项卡,然后单击右侧的应用程序名称。它仅显示遵循 OTP 原则的流程。如果您的示例与来自 cowboy 存储库的示例类似,那么您应该会在 ranch 下看到所有的接受器。 .

worker 列表为空的主管什么都不做。它就在那里,以防您以后需要添加一些进程。启动它没有任何害处,但也没有必要。可能是这样,程序员在从模板开始项目后懒得删除。

有两种应用:
  • 事件应用程序 - 使用进程来完成其工作(例如牧场),它们应该作为一个单元启动和停止
  • 库应用程序 - 只提供一些代码,在其他进程的上下文中运行(例如 json 解码器/编码器)

  • 通常,事件应用程序具有顶级管理程序,而库应用程序则没有。

    关于concurrency - Elixir/Erlang 和 Cowboy - 如何使用主管,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34796269/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com