2013-05-07 58 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