简短回答:OTP 关闭是同步的。 exit/2 是一条异步消息。
长答案:Erlang 中的所有消息都是异步的。关机消息也不例外。但是,关闭不仅仅是发送消息。主管在发送退出信号后监听{'DOWN', ...} 消息。只有在收到“DOWN”消息或超时后才会继续,因此实际上它是同步的。签出主管源代码。在第 894 行,定义了实际进行退出调用的函数:
shutdown(Pid, Time) ->
case monitor_child(Pid) of
ok ->
exit(Pid, shutdown), %% Try to shutdown gracefully
receive
{'DOWN', _MRef, process, Pid, shutdown} ->
ok;
{'DOWN', _MRef, process, Pid, OtherReason} ->
{error, OtherReason}
after Time ->
exit(Pid, kill), %% Force termination.
receive
{'DOWN', _MRef, process, Pid, OtherReason} ->
{error, OtherReason}
end
end;
{error, Reason} ->
{error, Reason}
end.
源代码可以在这里查看GitHub:https://github.com/erlang/otp/blob/maint/lib/stdlib/src/supervisor.erl#L894
另一方面,erlang:exit/2 调用只是一个异步退出信号