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