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

Erlang 如何遍历相同类型的多个GenServer?,erlang,elixir,gen-server,Erlang,Elixir,Gen Server,问题:我有一个类型FlyServer,需要迭代所有Fly过程。用于服务器上的各种计算 我如何做到这一点 一个选项是有一个包含所有FlyServer进程的GenServer列表。但如果它崩溃了呢?如果一个播放器崩溃了,而且不管出于什么原因,跟踪进程的GenServer没有得到通知,那该怎么办?如果这种情况不现实,请插话 每次飞行进程与服务器联系时,您都可以将其pid添加到列表中,该列表是gen_服务器状态的一部分 然后,服务器可以监控Fly进程,这意味着当Fly进程终止时,服务器将收到一条特殊消息

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

我如何做到这一点

一个选项是有一个包含所有FlyServer进程的GenServer列表。但如果它崩溃了呢?如果一个播放器崩溃了,而且不管出于什么原因,跟踪进程的GenServer没有得到通知,那该怎么办?如果这种情况不现实,请插话

  • 每次飞行进程与服务器联系时,您都可以将其pid添加到列表中,该列表是gen_服务器状态的一部分

  • 然后,服务器可以监控Fly进程,这意味着当Fly进程终止时,服务器将收到一条特殊消息

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

  • 一个选项是有一个包含所有FlyServer进程的GenServer列表。 但如果它崩溃了呢

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

  • 每次飞行进程与服务器联系时,您都可以将其pid添加到列表中,该列表是gen_服务器状态的一部分

  • 然后,服务器可以监控Fly进程,这意味着当Fly进程终止时,服务器将收到一条特殊消息

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

  • 一个选项是有一个包含所有FlyServer进程的GenServer列表。 但如果它崩溃了呢


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

    我建议您使用主管启动服务器,并呼叫主管:start\u child/2。主管应使用“一对一”策略,旨在创建和监督同类流程


    然后,您可以使用函数supervisor:which_children/1获得所有孩子的更新列表。我建议您使用一个supervisor启动服务器,并调用supervisor:start_children/2。主管应使用“一对一”策略,旨在创建和监督同类流程


    然后,您可以使用功能主管获得所有儿童的更新列表:哪个儿童/1

    您的确切用例是什么?您是否考虑过使用Phoenix Presence?当进程加入时,您可以让它们在上面注册。每当流程离开或加入时,您都会收到一条包含不同元数据的消息。在任何时候,您都可以查询活动进程的列表,并在必要时为它们设置标志(例如,指示它们处于不同的状态)如何迭代多个GenServer…?--你的题目和你的问题似乎不匹配。您的问题似乎表明您有一个
    gen_server
    (FlyServer)和多个客户端(Fly)进程。使用主管启动它们怎么样?并使用supervisor:which_children/1遍历它们。您的确切用例是什么?您是否考虑过使用Phoenix Presence?当进程加入时,您可以让它们在上面注册。每当流程离开或加入时,您都会收到一条包含不同元数据的消息。在任何时候,您都可以查询活动进程的列表,并在必要时为它们设置标志(例如,指示它们处于不同的状态)如何迭代多个GenServer…?--你的题目和你的问题似乎不匹配。您的问题似乎表明您有一个
    gen_server
    (FlyServer)和多个客户端(Fly)进程。使用主管启动它们怎么样?并使用supervisor:which_children/1遍历它们。