Erlang:为远程管理器使用gen_全局事件

Erlang:为远程管理器使用gen_全局事件,erlang,gen-event,Erlang,Gen Event,当我在本地注册时,我可以很好地启动我的事件框架: gen_event:start_link({local, foo_event_container}). gen_event:add_handler(foo_event_container, foo_event_handler, []). 调用registed()会显示foo_event_容器,当我向它发送消息时,它们会显示在处理程序中 但是,当我重新启动节点并尝试 gen_event:start_link({global, foo_event_

当我在本地注册时,我可以很好地启动我的事件框架:

gen_event:start_link({local, foo_event_container}).
gen_event:add_handler(foo_event_container, foo_event_handler, []).
调用registed()会显示foo_event_容器,当我向它发送消息时,它们会显示在处理程序中

但是,当我重新启动节点并尝试

gen_event:start_link({global, foo_event_container}).
registered()不显示容器,当我尝试向其添加处理程序时 我明白了

Sasl没有提供任何额外的信息,谷歌搜索这个问题会产生一个猜测,运行容器的外壳已经被杀死,这不是这里的情况,因为我试图从同一个节点访问它

1) 知道这是怎么回事吗?
2) 拥有一个远程容器是最好的设计,还是让每个服务器都使用本地容器将消息发送到远程进程更好


谢谢

本地注册和全局注册是独立的名称空间。本地注册的项目不会显示为全局注册,反之亦然。(此外,本地注册名称必须是原子,而全局名称可以是术语)

您的全局注册应该显示在
global:registered_names/0
中,您可以使用
global:send/2
或通过使用
global:whereis_name/1
查找pid并像往常一样向该pid发送消息,来发送到全局注册的进程

您应该能够通过执行类似于
gen\u事件:add\u handler({global,Name},handler,Args)
的操作来添加处理程序。大多数
gen.*
模块包含处理进程名称的代码,如
{global,Name}
为您执行
global
查找


最后,如果您
从shell启动\u link
一个进程,然后计算一个导致shell崩溃的表达式,该进程将被终止-它只是通过链接被shell错误终止。如果你想避免这种情况,可以在没有链接的情况下启动,或者在主管的指导下启动链接。将某些内容链接到shell进程通常不是一个好主意,因为输入错误会关闭您正在使用的进程。

是!将全局元组与gen_事件一起使用:add_handler({global,foo_event_container},foo_event_handler,[])非常有效,谢谢。(如果在某个地方记录了,那就好了…)如果有人需要查阅手册,这里是
** exception exit: noproc
     in function  gen:call/4
     in call from gen_event:rpc/2