在频道中使用GenServer。如何坚持pid?

时间:2016-05-09 01:20:15

标签: phoenix-framework

我在我的频道类中调用GenServer。 GenServer需要一个pid。我怎样才能坚持这个pid,这样每次调用GenServer中的join方法时,我都可以使用相同的pid调用GenServer?我应该将它保存在套接字参数中,还是应该在频道和前端javascript之间来回传递?

3 个答案:

答案 0 :(得分:1)

我最近在遇到类似的问题时遇到了类似问题我在处理GenServers时选择使用名称而不是pids。您可以将name参数传递给GenServer.start_link/3,然后在其他调用中使用它(例如GenServer.cast/2。在我的情况下,我使用发送到频道的唯一ID来为服务器生成名称(对于例如::"document-1")。

这种方法的最大缺点是BEAM对原子数有限制,因此如果生成的名称数量太大会导致崩溃,因此在实施此解决方案时必须考虑它。

答案 1 :(得分:0)

我解决这个问题的方法是将socket.topic传递给GenServer进程,因为如果客户端刷新浏览器,套接字的pid可能会发生变化。

从GenServer,您可以使用MyApp.Endpoint.broadcast! socket_topic, "some_notification", message广播回主题。 如果您选择或直接将其推送到客户端,您可以截取频道内的消息并进行处理。

答案 2 :(得分:0)

如果我没记错的话,在凤凰频道内创建的genserver进程会链接到频道进程。因此,您可能希望取消链接genserver进程与通道。然后为您的流程命名注册,以便相同的pid持续存在。