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 -eval 永远不会退出
从 bash 变量为 Erlang erl 传递 -eval 失败