【问题标题】: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). 时会发生什么?进程是退出还是我只是失去了对它的引用?

【问题讨论】:

    标签: concurrency process erlang pid erl


    【解决方案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 进程永远不会因为没有对它们的引用而消失。它们要么在完成其功能时死亡,要么发生错误,要么被另一个进程杀死。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 2013-10-13
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    相关资源
    最近更新 更多