2016-07-25 43 views
0

阅读gproc文档,它看起来像Key用于路由消息到不同的进程,所以我不知道如何在文档中工作的示例,因为它似乎使用不同的键为注册和发送消息。pub/sub与gproc - 模块是什么?

gproc文档,它们提供执行发布/订阅的以下示例:

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},不会使所述消息不同的基于哪个模块发送事件?

因此,举例来说,如果我订阅foo_bar类型的事件从模块1:

pub_sub:subscribe(foo_bar). 

,然后发布从模块2事件:

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}},并模块1将永远不会收到该消息。

或者我错过了什么?

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

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

所以它实际上是两个电话的{p, l, {pub_sub, foo_bar}}

参考文献:This后有助于理解gproc。