2014-12-01 94 views
3

我知道,你可以简单的瓶坯消息如下传递:是否可以向Erlang的未注册流程发送消息?

self() ! hello. 

,你可以看到消息致电:

的flush()。

我还可以创建功能简单的过程喜欢的东西:

spawn(module, function, args). 

但是我不明白怎么可以将消息发送到流程与出注册的PID。

我所看到的例子显示,你可以在外壳与此模式匹配得到的PID分配给一个变种,所以如果我创建了一个gen_server如:

... 
start_link() -> 
    gen_server:start_link(?MODULE, init, []). 

init(Pid) -> 
    {ok, Pid}. 
... 

然后我就可以用调用它从shell执行以下操作:

{ok, Pid} = test_sup:start_link(). 
{ok,<0.143.0>} 
> Pid ! test. 
test 

所以我的问题是,你可以发送邮件到PIDS形式< 0.0.0>与出皆称在壳体中的原子或变量?试验和检索证明是徒劳的...

回答

4

如果您碰巧需要根据其Pid的文本表示形式发送消息给Pid,那么可以这样做(假设字符串为“< 0.42.0>”) :

list_to_pid("<0.42.0>") ! Message 

这几乎是唯一的外壳(在这里你可以看到日志信息的输出或监视来自像观测数据)非常有用;任何产生的过程通常应该是与其相关联(或被监控)的某种形式的父过程的孩子。

至于直接将消息发送到你刚才催生,spawn返回一个PID控制,所以你可以给它分配给一个变量(这是一样对其进行注册):

Pid = spawn(M, F, A), 
Pid ! Message. 
+1

确实。要么你有办法在你的代码流中以某种方式检索Pid(例如将它保持在你的循环/进程状态),或者你需要注册它来再次找到它。您也可以将PID存储在数据库中(例如ETS或Mnesia,在内存中)。 – 2014-12-01 21:06:04

+0

我曾经使用过ETS跟踪过程,似乎是一个很好的方法,因为我是新来的Erlang,所以有一些好的意见。感谢您的澄清 – Opentuned 2014-12-01 21:40:23

+1

@Opentuned如果您以前发现ETS表对此有用,您可能需要查看“pg2”(http://www.erlang.org/doc/man/pg2.html,http:// pdincau.wordpress.com/2012/01/12/a-survival-guide-on-pg2-erlang-module/),'global'(http://www.erlang.org/doc/man/global.html)和'gproc'(https://github.com/uwiger/gproc)。 – zxq9 2014-12-01 22:58:04

1

如果你有字符串“”识别PID,它是

  • 或者是因为你是在外壳的工作,和你用你看到的表现,你忘了该PID存储在一个变量。然后,只需使用pid(X,Y,Z)来获取它;
  • 要么因为你做了类似io_lib:format(“〜p”,[Val])其中Val是pid或包含此pid的erlang项。然后简单地将pid分配给一个变量(直接或从术语中提取)。它可以存储在ets中,发送到另一个进程而无需转换

您应该避免使用shell(或字符串)表示。其中一个原因是,如下一个屏幕截图所示,当您询问来自2个不同节点的一个进程的PID时,此表示方式会有所不同。

enter image description here

+0

感谢您的观点,您是对的,这是因为我在shell中工作,因为我正在学习绳索......我没有变量来与Pid一起工作的原因是我习惯于使用寄存器命令,但是我正在与OTP顶级主管合作,并使用proc_lib:start_link和proc_lib:init_ack来获得为OTP sup所确认的适当进程,但这是从问题的初始范围离题。如果我无法取得进展,可能需要稍后再发布。谢谢! – Opentuned 2014-12-02 18:23:18

相关问题