阅读gproc文档时,看起来他们使用Key
将邮件路由到不同的进程,所以我无法弄清楚 pub / sub 示例在文档中是如何工作的,因为它似乎使用不同的密钥来注册和发送消息。
在gproc文档中,它们提供了以下实现pub / sub的示例:
subscribe(Event) ->
gproc:reg({p, l, {?MODULE, Event}}).
publish(Event, Data) ->
gproc:send({p, l, {?MODULE, Event}}, {?MODULE, Event, Data}).
gproc:send
第二个参数:{?MODULE, Event, Data}
,不会根据发送事件的模块使消息不同吗?
例如,如果我从module1订阅类型为foo_bar
的事件:
pub_sub:subscribe(foo_bar).
然后从module2发布一个事件:
pub_sub:publish(foo_bar, {color, "Blue"}).
第一次调用对gproc的调用将是:
gproc:reg({p, l, {module1, foo_bar}}).
而第二个:
gproc:send({p, l, {module2, foo_bar}}, {module2, foo_bar, {color, "Blue}}).
因此,密钥似乎不同:{p, l, {module1, foo_bar}}
和{p, l, {module2, foo_bar}}
, module1 永远不会收到消息。
或者我错过了什么?
P.S。:语法here略有不同,但我仍然看到同样的问题:
subscribe(EventType) ->
%% Gproc notation: {p, l, Name} means {(p)roperty, (l)ocal, Name}
gproc:reg({p, l, {?MODULE, EventType}}).
notify(EventType, Msg) ->
Key = {?MODULE, EventType},
gproc:send({p, l, Key}, {self(), Key, Msg}).
答案 0 :(得分:0)