我试图理解Teplate parse error
和spawn
之间的差异,但不能完全理解当流程执行的功能结束时会发生什么。
spawn_link
我预计主要流程会失败,因为它与在程序结束前明显死亡的流程相关联。然而,"再见"打印消息,然后程序正常退出。将defmodule SendAndDie do
def send_and_die(target) do
send(target, "Goodbye")
# Process.exit(self, :boom)
end
end
dying_process = spawn_link(SendAndDie, :send_and_die, [self])
:timer.sleep(500)
IO.puts("Dying process is alive: #{Process.alive?(dying_process)}")
receive do
msg -> IO.puts(msg)
end
更改为spawn_link
无效。
当我取消注释第4行中的spawn
时,我确实看到了Process.exit
和spawn
之间的区别(后者会停止整个程序,而前者则不会)。但是,spawn_link
是Process.exit
函数中的最后一次执行。当函数结束时,无论如何都不会退出进程吗?
答案 0 :(得分:7)
来自the erlang manual on processes
当进程收到退出原因不是正常的退出信号时,默认行为是终止,然后以相同的退出原因向其链接进程发出退出信号。
当进程的初始函数返回时,它以原因normal
终止,因此此默认行为不会导致链接进程失效。