如何在Elixir中动态创建Genserver?

时间:2018-07-25 15:57:33

标签: elixir phoenix-framework gen-server

我需要创建进程运行时,以保持不同的状态。 我的:config中有一个用户列表,例如:

config :backend,
 users: [user1, user2, user3]

是否可以遍历此列表并为它们中的每一个创建受监视的代理或Genserver?

1 个答案:

答案 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)