【发布时间】:2016-07-26 05:18:20
【问题描述】:
阅读 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},这不会使消息根据发送事件的模块而有所不同吗?
例如,如果我从模块 1 订阅 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}).
【问题讨论】:
标签: erlang