Erlang:当你在 erl 中 f() 一个 Pid 时会发生啥?

Posted

技术标签:

【中文标题】Erlang:当你在 erl 中 f() 一个 Pid 时会发生啥?【英文标题】:Erlang: What happens when you f() a Pid in erl?Erlang:当你在 erl 中 f() 一个 Pid 时会发生什么? 【发布时间】:2013-04-01 00:56:11 【问题描述】:

假设我正在erl 中处理一些简单的流程:

1> Fun = fun(F) -> F(F) end.
#Fun<erl_eval.6.82930912>
2> Pid = spawn(fun() -> Fun(Fun) end).
<0.178.0>
3> f(Pid).

当我执行f(Pid). 时会发生什么?进程是退出还是我只是失去了对它的引用?

【问题讨论】:

【参考方案1】:

根据documentationf(Pid)去掉变量Pid的绑定,进程没有停止。

你可以这样测试:假设你有一个名为myserver的gen_server,它基于emacs erlang模式提供的骨架。

1> ok, Pid = myserver:start_link().
ok,<0.39.0>
2> f(Pid).
ok
3> gen_server:call(pid(0,39,0), mycall).
ok
4> gen_server:call(myserver, mycall).
ok

正如您所见,即使我们使用了f(Pid),我们仍然可以使用它的 pid 或注册期间使用的原子(在我们的例子中是模块名称)联系该进程。

【讨论】:

谢谢!我觉得文档对于删除绑定时会发生什么含糊不清,但您的示例明确说明了这一点。 @agarrett 进程永远不会因为没有对它们的引用而消失。它们要么在完成其功能时死亡,要么发生错误,要么被另一个进程杀死。

以上是关于Erlang:当你在 erl 中 f() 一个 Pid 时会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Erlang 中的多个 erl 之间共享记录?

Erl 中的记录(Erlang 问题)

Erlang:从命令行调用 erl -eval 永远不会退出

从 bash 变量为 Erlang erl 传递 -eval 失败

原因:在 erl 控制台 [Erlang] 中运行常见测试时 undef

如何在不中止 erl 的情况下中止 Erlang shell (erl) 中的接收语句?