如何遍历许多相同类型的GenServer?

时间:2019-02-02 04:01:36

标签: erlang elixir gen-server

问题:我有一个FlyServer类型,需要遍历所有Fly进程。用于服务器上的各种计算。

我如何做到这一点?

一个选择是拥有所有FlyServer进程的GenServer列表。但是,如果崩溃了怎么办?而且,如果播放器崩溃了,并且由于某种原因而没有通知GenServer跟踪进程怎么办-如果这种情况不切实际,请发出提示。

2 个答案:

答案 0 :(得分:4)

我建议您使用主管来启动服务器,并调用supervisor:start_child / 2。主管应使用simple_one_for_one策略,该策略旨在创建和监督相同类型的流程。

然后您可以使用功能supervisor:which_children / 1

获取所有儿童的更新列表。

答案 1 :(得分:2)

  1. 每次Fly进程与服务器联系时,您都可以将其pid添加到列表中,该列表是gen_server状态的一部分。

  2. 然后服务器可以 const fullpage = new fullpage('#fullpagediv', { normalScrollElements: '.scroll-box' }) Fly进程,这意味着当Fly进程终止时,服务器将收到一条特殊消息。

  3. 服务器可以实现一个接收子句,该子句的模式与特殊消息匹配,然后从列表中删除终止的进程的pid。

  

一个选择是拥有所有FlyServer进程的GenServer列表。   但是,如果崩溃了怎么办?

然后将在回调模块中调用monitor,该模块可以将State保存到ets,dets或mnesia表中。当然,如果有人通过将运行FlyServer的服务器连接到电源插座的电线绊倒,则执行将立即停止,并且不会调用terminate(Reason, State)。有关解决方案,请参见terminate()