Process 是否可以向Erlang中未注册的进程发送消息?

Process 是否可以向Erlang中未注册的进程发送消息?,process,erlang,message-passing,Process,Erlang,Message Passing,我知道您可以通过以下方式执行简单的消息传递: self() ! hello. 您可以通过拨打以下电话查看信息: 刷新() 我还可以在函数中创建简单的流程,例如: spawn(module, function, args). 但是,我不清楚如何在不注册Pid的情况下向进程发送消息 我已经看到一些示例,表明您可以在shell中对此进行模式匹配,以获得分配给var的Pid,因此如果我创建一个gen_服务器,例如: ... start_link() -> gen_server:start

我知道您可以通过以下方式执行简单的消息传递:

self() ! hello. 
您可以通过拨打以下电话查看信息:

刷新()

我还可以在函数中创建简单的流程,例如:

spawn(module, function, args).
但是,我不清楚如何在不注册Pid的情况下向进程发送消息

我已经看到一些示例,表明您可以在shell中对此进行模式匹配,以获得分配给var的Pid,因此如果我创建一个gen_服务器,例如:

...
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
{ok,Pid}=test\u sup:start\u link()。
{好的,}
>Pid!测试。
测试

所以我的问题是,您是否可以在不将消息注册到shell中的原子或变量的情况下,以表单的形式向PID发送消息?实验和搜索证明是徒劳的…

如果您碰巧需要根据Pid的文本表示向Pid发送消息,您可以这样做(假设字符串为“”):

如果您有字符串“”来标识pid,则它是

  • 或者是因为您在shell中工作,并且使用了您看到的表示,而忘记将此pid存储在变量中。然后简单地使用pid(X,Y,Z)得到它
  • 要么是因为您执行了类似io_lib:format(“~p”,[Val])的操作,其中Val是pid,要么是包含此pid的erlang术语。然后简单地将pid分配给一个变量(直接或从术语中提取)。它可以存储在ets中,发送到另一个进程而无需转换
应该避免使用shell(或字符串)表示形式。一个原因是,当您从两个不同的节点询问一个进程的pid时,此表示不同,如下一个屏幕截图所示


确实如此。您可以通过某种方式在代码流中检索Pid(例如,将其保持在循环/进程状态),或者您需要注册它以再次找到它。您也可以将PID存储在数据库中(例如,在内存中存储ETS或Mnesia)。我以前使用过ETS来跟踪进程,这似乎是一种很好的方法,因为我是Erlang的新手,所以有一些意见很好。谢谢你的邀请clarification@Opentuned如果您以前发现ETS表格在这方面很有用,您可能需要查看
pg2
(,)、
global
()和
gproc
()。很酷,谢谢zxq9,这看起来像是我应该使用的工具。。。谢谢谢谢你的观点,你是对的,这是因为我在壳中工作,因为我正在学习绳索。。。我没有变量与Pid一起工作的原因是我习惯于使用register命令,但是我与OTP顶级主管一起工作,并使用proc_lib:start_link和proc_lib:init_ack来获得生成的适当进程,以便OTP sup确认,但这偏离了问题的初始范围。如果我不能取得任何进展,我可能不得不在以后发布一个后续文章。谢谢
list_to_pid("<0.42.0>") ! Message
Pid = spawn(M, F, A),
Pid ! Message.