erlang进程间多播

erlang进程间多播,erlang,multicast,ets,Erlang,Multicast,Ets,我正试图在erlang中开发一个聊天服务器,我想在一组进程之间广播消息,我想出了三个备选方案 将每条消息发送到主进程,主进程将消息发送到 其他人,我觉得这是个瓶颈 使用包含该组所有PID的全局ets表 (过度复制) 使用upd多播 pg模块,与1相同 最好的方法是什么,还有其他选择吗?更自然的方法是让每个进程知道它将与之通信的每个其他进程的pid()。将[pid()]保持在进程状态,并通过使用link/1使{'EXIT',pid,Reason}在进程结束时接收,使其保持最新状态。Erlang中的

我正试图在erlang中开发一个聊天服务器,我想在一组进程之间广播消息,我想出了三个备选方案

  • 将每条消息发送到主进程,主进程将消息发送到 其他人,我觉得这是个瓶颈
  • 使用包含该组所有PID的全局ets表 (过度复制)
  • 使用upd多播
  • pg模块,与1相同

  • 最好的方法是什么,还有其他选择吗?

    更自然的方法是让每个进程知道它将与之通信的每个其他进程的pid()。将[pid()]保持在进程状态,并通过使用link/1使{'EXIT',pid,Reason}在进程结束时接收,使其保持最新状态。

    Erlang中的多播是对每个接收者的单播。除此之外,没有其他方法可以广播信息。由于您只有少量的进程,我认为您在复制方面不会有任何问题。至少在它成为系统的瓶颈之前,我不会太担心它

    不要低估保持一个进程作为一个组的多主进程。这可能是一个简单的解决方案,尽管只是将pid()保留在ETS表中或使用
    gproc
    ,因为它可能完全相同

    担心过度复制在一开始可能不会有什么成效。这里的一个技巧可能是将消息存储为一个大的二进制文件,然后发送出去。然后,正如Marcelo所写的,您只需要传递引用


    万斯·希普利关于链接的解决方案是我会避免的。链接是双向的,您必须捕获出口才能获得出口消息。通过调用erlang:monitor(process,Pid)来维护生命周期知识可能更好。您需要这样做,因为必须从组中删除离开的流程。收到形式为
    {'DOWN',…,…}
    的消息将表明您需要注意清理工作。

    您希望组的规模有多大?对于10人组和100万人组,答案会有所不同。100人组每个包含100个发送文本、压缩视频和音频的客户端。那么,我怀疑您是否会发现选项1存在任何重大问题。视频和音频——我猜是以二进制文件表示的——将倾向于在全局堆中结束,而不会被复制。进程状态!它和进程字典一样吗?在函数式编程中,我们将函数中需要的数据作为参数传递。主循环的参数可以维护进程的状态数据。对于OTP Behaviors gen_server和gen_fsm,您用来保存进程状态数据的所有函数都有一个
    State
    参数。虽然我在Haskell中寻找像TChan这样更高效的函数,但答案很好。Haskell
    STM.TChan
    不执行多播IIRC。它是一个无限的FIFO通道,没有扇出。