我正在尝试在erlang中开发一个聊天服务器,我想在一组进程之间广播消息,我提出了三个替代方案
什么是最好的方法,还有其他选择吗?
答案 0 :(得分:2)
更自然的方法是让每个进程都知道它将与之通信的每个其他进程的pid()。保持[pid()]处于进程状态并使用link / 1使其保持最新状态,以便在进程终止时接收{'EXIT',Pid,Reason}。
答案 1 :(得分:1)
Erlang中的多播是每个收件人的单播。没有办法广播除此之外的信息。由于您只有少量的进程,我认为您根本不会有任何复制问题。至少我不会太担心它,直到它成为系统的瓶颈。
不要低估保持一个适合群组的多人过程的过程。这可能是一个简单的解决方案,虽然只是将pid()保存在ETS表中或使用gproc
可能是相同的。
担心过度复制可能在一开始就不会有成效。这里的一个技巧可能是将消息存储为一个大二进制文件然后发送它。然后,正如马塞洛所写,你只能绕过参考文献。
Vance Shipley关于链接的解决方案是我要避免的。链接是双向的,您必须捕获退出以获取退出消息。通过调用erlang:monitor(process, Pid)
维护终身知识可能更好。您需要这样做,因为必须从组中删除必须离开的进程。接收{'DOWN', ..., ...}
形式的消息将是您需要处理清理的标志。