Concurrency Erlang:在erl中使用f()作为Pid时会发生什么?

Concurrency Erlang:在erl中使用f()作为Pid时会发生什么?,concurrency,process,erlang,pid,erl,Concurrency,Process,Erlang,Pid,Erl,假设我正在使用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). 1>Fun=Fun(F)->F(F)end。 #乐趣 2> Pid=spawn(fun()->fun(fun)end)。 3> f(Pid)。 执行f(Pid)时会发生什么

假设我正在使用
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).
1>Fun=Fun(F)->F(F)end。
#乐趣
2> Pid=spawn(fun()->fun(fun)end)。
3> f(Pid)。
执行
f(Pid)时会发生什么情况。
?进程是退出还是丢失了对它的引用?

根据
f(Pid)
删除变量Pid的绑定,进程不会停止

您可以这样测试它:假设您有一个名为
myserver
的gen_服务器,它基于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
1>{ok,Pid}=myserver:start\u link()。
{好的,}
2> f(Pid)。
好啊
3> gen_服务器:调用(pid(0,39,0),mycall)。
好啊
4> gen_server:call(myserver,mycall)。
好啊

正如您所看到的,即使我们做了
f(Pid)
我们仍然可以使用进程的Pid或注册过程中使用的atom(在我们的例子中是模块名)联系进程。

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