Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Elixir中动态创建GenServer?_Elixir_Phoenix Framework_Gen Server - Fatal编程技术网

如何在Elixir中动态创建GenServer?

如何在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

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

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
来引用流程。