erlang中的事件管理器进程。命名进程还是PID?

erlang中的事件管理器进程。命名进程还是PID?,erlang,otp,Erlang,Otp,我有一个事件管理器进程,它将事件分派给订阅者(例如创建http会话、销毁http会话)。如果使用Pid而不是命名进程,我必须将其放入函数中以使用事件管理器进行操作,但如果使用命名进程,代码将更清晰 哪种变体是正确的 谢谢大家! 如果您有一组固定的“订户”进程,那么请使用注册名称 相反,如果您有一种发布/订阅式的体系结构,订阅者来来去去去,那么您需要一个基础结构来跟踪它们,从这一点上说,使用Pid()或名称并不重要 使用注册名称的缺点之一是需要在代码库中跟踪它们以避免“冲突”。因此,这取决于您:就

我有一个事件管理器进程,它将事件分派给订阅者(例如创建http会话、销毁http会话)。如果使用Pid而不是命名进程,我必须将其放入函数中以使用事件管理器进行操作,但如果使用命名进程,代码将更清晰

哪种变体是正确的


谢谢大家!

如果您有一组固定的“订户”进程,那么请使用注册名称

相反,如果您有一种发布/订阅式的体系结构,订阅者来来去去去,那么您需要一个基础结构来跟踪它们,从这一点上说,使用Pid()或名称并不重要


使用注册名称的缺点之一是需要在代码库中跟踪它们以避免“冲突”。因此,这取决于您:就个人而言,我倾向于使用命名流程,因为正如您所说,它可以使代码的阅读更加清晰。不管怎样,OTP都不在乎。

虽然流程命名、注册并没有实际区别,但它是全局的。你本质上是在告诉系统,这是一个任何人都可以使用的全球服务


从你的描述来看,这听起来更像是你给他们起了名字,以节省在你的循环中携带他们的小小努力。如果是这样的话,我会把他们的PID和你随身携带的所有其他状态数据放在一个记录中。这更好地指示了进程的类型。

通过在您所在状态的记录中携带事件管理器引用,您仍然可以使用atom作为该字段中的注册名称。因此,如果事件管理器崩溃并重新启动并重新命名,您将自动将事件发送到最新的管理器。只有在事件管理器停机期间发送消息时,才会出现badarg异常。当然可以。我仍然不喜欢给事物起全局名称,如果它们不是要被全局引用的,我无法从最初的问题中判断是否如此。