2013-05-07 54 views
1

如何使用,我得到的註冊進程的進程ID GPROC: -Gproc如何獲得註冊過程的進程ID?

我註冊使用

gproc:reg({p,l,myroom})

現在的過程中,我使用二郎:START_TIMER其預計無論是進程ID或註冊名稱。

erlang:start_timer(3000, self(), "Test Msg"), 

所以,而不是self()我想提供myroom的進程ID。以便所有用戶在3000毫秒後都可以獲得測試消息。

+0

GPROC文檔搬到這裏:http://blog.rusty.io/2009/09/16/g -proc-erlang-global-process-registry/ – 2013-05-07 14:05:42

+0

該文檔實際上位於GitHub上:https://github.com/uwiger/gproc/blob/master/doc/gproc.md – 2013-05-07 20:17:11

回答

2

所以你可能試圖在這裏做錯誤的事情。 erlang:start_timer/3將單個pid作爲參數,但您希望發送消息給零個或多個具有本地myroom屬性的pid。這聽起來像你可能會關閉使用gproc_ps發送郵件好,也許只是使用

timer:apply_after(3000, gproc_ps, publish, [l, myroom, "Test Msg"]). 

這會發送消息到是在你想發送的時間預訂的myroom事件所有PID消息。這意味着,即使訂購了之後的Pid,在之後預定(但在它啓動之前)仍然會收到通知。這可能是期望的行爲。如果沒有,你可以做你的離去註冊原樣,只是創建具有myroom財產每個PID定時器:

[erlang:start_timer(3000, Pid, {msg, "Test Msg"}) || Pid <- gproc:lookup_pids({p, l, myroom})]. 
+0

謝謝!這是我正在尋找gproc_ps ..將盡力與.. .. – 2013-05-08 00:16:17

0

嘗試gproc:lookup_pid({p,1,myroom})。

+0

感謝您的回覆Jan,但是,它會生成一個異常......''異常錯誤:函數gproc中的錯誤參數 :其中/ 1 在gproc調用中調用gproc:where({p,l,jaan}) :lookup_pid/1(src/gproc.erl,第1308行) ' – 2013-05-07 07:35:17

+0

有趣的是,它是gproc:lookup_pids({p,l,myroom}),其中r但是,如果我將相同的Pid傳遞給erlang:start_timer(3000,gproc:lookup_pids({p,l,myroom}),「Test Mg」)。它產生了一個不好的論證例外.. :( – 2013-05-07 07:51:45

+0

後挖掘更多的細節。即使我這樣做,它會給我列出了在myroom下注冊的Pid,但我想要的過程myroom – 2013-05-07 07:58:30