【问题标题】:pub/sub with gproc - what is module?使用 gproc 发布/订阅 - 什么是模块?
【发布时间】: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


    【解决方案1】:

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

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

    参考:This 帖子有助于理解 gproc。

    【讨论】:

      猜你喜欢
      • 2020-11-07
      • 2017-02-27
      • 2012-11-10
      • 1970-01-01
      • 2016-12-14
      • 2011-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多