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

Ope*_*ned 5 erlang process message-passing

我知道您可以使用以下内容执行简单的消息传递:

self() ! hello. 
Run Code Online (Sandbox Code Playgroud)

您可以通过调用查看消息:

冲洗()。

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

spawn(module, function, args).
Run Code Online (Sandbox Code Playgroud)

但是我不清楚如何在不注册 Pid 的情况下向进程发送消息。

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

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

init(Pid) ->
  {ok, Pid}.
...
Run Code Online (Sandbox Code Playgroud)

然后我可以在 shell 中使用以下命令调用它:

{ok, Pid} = test_sup:start_link().
{ok,<0.143.0>}
> Pid ! test.
test
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,您能否以 <0.0.0> 的形式向 Pids 发送消息,而无需将它们注册到 shell 中的原子或变量?实验和搜索被证明是徒劳的......

zxq*_*xq9 5

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

list_to_pid("<0.42.0>") ! Message
Run Code Online (Sandbox Code Playgroud)

这几乎只在 shell 中有用(您可以在其中查看日志消息的输出或从 Observer 等监控数据);任何产生的进程通常应该是它所链接(或监视)的某种形式的父进程的子进程。

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

Pid = spawn(M, F, A),
Pid ! Message.
Run Code Online (Sandbox Code Playgroud)