如何在Elixir中动态创建GenServer?
我需要在运行时创建进程,以保持不同的状态。 我在my:config中有一个用户列表,例如:如何在Elixir中动态创建GenServer?,elixir,phoenix-framework,gen-server,Elixir,Phoenix Framework,Gen Server,我需要在运行时创建进程,以保持不同的状态。 我在my:config中有一个用户列表,例如: config :backend, users: [user1, user2, user3] 是否可以循环浏览此列表并为每个列表创建一个受监控的代理或Genserver?假设confix.exs中的代码正确 config :backend, users: ~w[user1 user2 user3] 要动态启动受监督的子级,可以使用e。g、 在静态初始化代码中,启动DynamicSuperviso
config :backend,
users: [user1, user2, user3]
是否可以循环浏览此列表并为每个列表创建一个受监控的代理或Genserver?假设
confix.exs
中的代码正确
config :backend,
users: ~w[user1 user2 user3]
要动态启动受监督的子级,可以使用e。g、
在静态初始化代码中,启动DynamicSupervisor
,不带任何子项:
子项=[
...,
{DynamicSupervisor,strategy::one_for_one,name:MyApp.DS}
]
主管.启动链接(儿童,策略::一对一)
当您想动态启动子系统时,您基本上会:
users=Application.get_env(:backend,:users,[])
代理人=
Enum.map(用户,fn用户->
使用{:确定,代理}%{}end})do
Agent.update(Agent,&Map.put(&1,:user,user))
结束
(完)
是的,这确实是可能的。旁注:您发布的不是有效的长生不老药。非常感谢。顺便说一句,代理会在算术异常时终止,而不会重新启动,就像它们没有被监控一样。不可能。我确信使用上面的代码DynamicSupervisor
会在终止时重新启动代理。糟糕的是,我再次查看了日志,在前一个被终止后,我可以看到“Client#PID处于活动状态”。问题是,现在我无法使用代理再次访问它(当我手动启动上一个时,从模式匹配{:ok,agent})。我需要给这些代理一个名称,但是如果它们重新启动,我需要用相同的名称访问它们。这超出了这个问题的范围。为代理提供名称,或者使用查找代理,有很多方法可以通过名称而不是通过PID
来引用流程。