pub / sub with gproc - 什么是模块?

时间:2016-07-25 17:10:41

标签: erlang

阅读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}).

1 个答案:

答案 0 :(得分:0)

没关系。关键是相同的,因为?MODULE宏总是扩展到它定义的模块!

因此两次调用实际上都是{p, l, {pub_sub, foo_bar}}

参考文献:This帖子对理解gproc非常有用。