erlang进程间组播

时间:2012-10-17 01:42:25

标签: erlang multicast ets

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

  1. 将每条消息发送到发送消息的主进程 对于我来说,它看起来像是一个瓶颈!。
  2. 使用包含该组所有pid的全局ets表 (过度复制)。
  3. 使用upd multicast。
  4. pg模块与1相同。
  5. 什么是最好的方法,还有其他选择吗?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

Erlang中的多播是每个收件人的单播。没有办法广播除此之外的信息。由于您只有少量的进程,我认为您根本不会有任何复制问题。至少我不会太担心它,直到它成为系统的瓶颈。

不要低估保持一个适合群组的多人过程的过程。这可能是一个简单的解决方案,虽然只是将pid()保存在ETS表中或使用gproc可能是相同的。

担心过度复制可能在一开始就不会有成效。这里的一个技巧可能是将消息存储为一个大二进制文件然后发送它。然后,正如马塞洛所写,你只能绕过参考文献。

Vance Shipley关于链接的解决方案是我要避免的。链接是双向的,您必须捕获退出以获取退出消息。通过调用erlang:monitor(process, Pid)维护终身知识可能更好。您需要这样做,因为必须从组中删除必须离开的进程。接收{'DOWN', ..., ...}形式的消息将是您需要处理清理的标志。