我需要创建进程运行时,以保持不同的状态。 我的:config中有一个用户列表,例如:
config :backend,
users: [user1, user2, user3]
是否可以遍历此列表并为它们中的每一个创建受监视的代理或Genserver?
答案 0 :(得分:2)
假设confix.exs
中的代码正确
config :backend,
users: ~w[user1 user2 user3]
要动态地启动受监管的孩子,您可以使用e。 G。 DynamicSupervisor
。
在您的静态初始化代码中,您将在没有任何子级的情况下启动DynamicSupervisor
:
children = [
...,
{DynamicSupervisor, strategy: :one_for_one, name: MyApp.DS}
]
Supervisor.start_link(children, strategy: :one_for_one)
并且想要动态地启动子级时,基本上可以这样做:
users = Application.get_env(:backend, :users, [])
agents =
Enum.map(users, fn user ->
with {:ok, agent} <- DynamicSupervisor.start_child(MyApp.DS, {Agent, fn -> %{} end}) do
Agent.update(agent, &Map.put(&1, :user, user))
end
end)