在erlang中的spawn内部退出调用

时间:2017-02-08 07:25:12

标签: erlang

我是Erlang的新手,我想知道两个代码片段之间的区别。

 spawn_link(exit(fun()-> myfun() end))

spawn_link(fun()->exit(myfun()) end)

我认为行为是一样的,但事实并非如此。

1 个答案:

答案 0 :(得分:4)

spawn_link是一个函数,调用的行为与普通函数调用类似:首先计算参数,然后使用计算的参数调用函数。

所以在第一个例子中,spawn_link的参数是:

exit(fun()-> myfun() end)

exit,当使用一个参数调用时,使用参数作为退出原因使当前进程退出。因此,在这种情况下,进程在有机会调用spawn_link之前崩溃,并且永远不会生成新进程。 (当前进程的退出原因是fun,这是非常不寻常的,但允许。fun将不会被调用。)

在第二个例子中,spawn_link的参数是:

fun()->exit(myfun()) end

那是fun。在调用函数之前,不会评估其中的表达式。因此,我们将此函数传递给spawn_link,这会生成一个运行此函数的新进程。新生成的流程将调用myfun,然后以myfun的返回值作为退出原因退出。