2016-07-25 54 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。