创建一个拥有多个 children 长生不老药的主管
Creating a Supervisor having multiple children elixir
我正在尝试从用户那里获取输入,然后创建生成服务器的数量作为输入并监督它们。我的代码类似于
defmodule GossSim do
use Supervisor
def main(args) do
# Since it is a mix generated project I had to put the main
Supervisor.start_link(__MODULE__, args)
end
def start_link(args) do
Supervisor.start_link(__MODULE__, args)
end
#The two methods down below create children dynamically
def get_child_list(child_list, 0), do: child_list
def get_child_list(child_list, num_of_nodes) do
child =
%{
id: :rand.uniform(num_of_nodes*100000),
start: {Gossip_node, :start_link, [[0,true]]}
}
if num_of_nodes > 0 do
get_child_list( [child] ++ child_list, num_of_nodes-1)
end
end
def init(args) do
children = get_child_list([], 10)
# The outut of this inspect is pasted below
IO.inspect children, label: "The children list is"
// some function that does something parse_args_and_start(args)
// num_of_nodes is 10
children = get_child_list([], num_of_nodes)
Supervisor.init(children, strategy: :simple_one_for_one)
end
我收到以下错误
bad child specification, invalid children: [%{id: 512, start: {Gossip_node, :start_link, [[0, true]]}, type: :worker}, %{id: 49677, start: {Gossip_node, :start_link, [[0, true]]}, type: :worker},
后跟所有 children 进程的列表。这些进程具有不同的 ID
Supervisor 文档说如果 supervisor 有一个开始和一个 id 就可以了。由于 children 是一个列表,因此我在其中添加了多个 children 的地图。我错过了什么吗? Gossip_node 是同一文件夹中的模块。
:simple_one_for_one
策略已弃用,取而代之的是 DynamicSupervisor
无论如何,让我们快速浏览一下 docs 未被弃用的情况:
:simple_one_for_one - similar to :one_for_one but suits better when dynamically attaching children. This strategy requires the supervisor specification to contain only one child.
因此,您需要将主管的策略更改为 :one_for_one
(或其他策略):
Supervisor.init(children, strategy: :simple_one_for_one)
或创建一个有一个 child 的主管(如果使用 DynamicSupervisor
,则没有 children)并动态附加每个 child。
我正在尝试从用户那里获取输入,然后创建生成服务器的数量作为输入并监督它们。我的代码类似于
defmodule GossSim do
use Supervisor
def main(args) do
# Since it is a mix generated project I had to put the main
Supervisor.start_link(__MODULE__, args)
end
def start_link(args) do
Supervisor.start_link(__MODULE__, args)
end
#The two methods down below create children dynamically
def get_child_list(child_list, 0), do: child_list
def get_child_list(child_list, num_of_nodes) do
child =
%{
id: :rand.uniform(num_of_nodes*100000),
start: {Gossip_node, :start_link, [[0,true]]}
}
if num_of_nodes > 0 do
get_child_list( [child] ++ child_list, num_of_nodes-1)
end
end
def init(args) do
children = get_child_list([], 10)
# The outut of this inspect is pasted below
IO.inspect children, label: "The children list is"
// some function that does something parse_args_and_start(args)
// num_of_nodes is 10
children = get_child_list([], num_of_nodes)
Supervisor.init(children, strategy: :simple_one_for_one)
end
我收到以下错误
bad child specification, invalid children: [%{id: 512, start: {Gossip_node, :start_link, [[0, true]]}, type: :worker}, %{id: 49677, start: {Gossip_node, :start_link, [[0, true]]}, type: :worker},
后跟所有 children 进程的列表。这些进程具有不同的 ID
Supervisor 文档说如果 supervisor 有一个开始和一个 id 就可以了。由于 children 是一个列表,因此我在其中添加了多个 children 的地图。我错过了什么吗? Gossip_node 是同一文件夹中的模块。
:simple_one_for_one
策略已弃用,取而代之的是 DynamicSupervisor
无论如何,让我们快速浏览一下 docs 未被弃用的情况:
:simple_one_for_one - similar to :one_for_one but suits better when dynamically attaching children. This strategy requires the supervisor specification to contain only one child.
因此,您需要将主管的策略更改为 :one_for_one
(或其他策略):
Supervisor.init(children, strategy: :simple_one_for_one)
或创建一个有一个 child 的主管(如果使用 DynamicSupervisor
,则没有 children)并动态附加每个 child。