退出,是)
在观看了Erlang的Pragmatic Studio屏幕后,Supervisors上的最后一段视频提到,为了让主管得到关于其中一个子项的通知,以便它可以正确地重新启动它,那么应该向process_flag(trap_exit, true)
。 也许我只是误解了作者(而且我误解的可能性非常高),但我认为主管自动地知道他们的孩子何时死亡(可能通过spawn_link或类似的背景)。 这真的有必要吗? 什么时候应该在实际案例中使用process_flag(trap_exit,true),因为文档明确指出以下内容:
http://www.erlang.org/doc/man/erlang.html#process_flag-2
process_flag(trap_exit,布尔)
当trap_exit设置为true时,到达进程的退出信号将转换为{'EXIT',From,Reason}消息,这些消息可以作为普通消息接收。 如果trap_exit设置为false,则进程退出,如果它接收到非正常的退出信号并且退出信号传播到其链接的进程。 应用程序通常不应该陷入退出
你有3个成语:
1 /我不在乎我的孩子过程是否会死亡:
spawn(...)
2 /如果我的子进程崩溃,我想崩溃:
spawn_link(...)
3 /如果我的子进程终止(通常或不是),我想要收到一条消息:
process_flag(trap_exit, true),
spawn_link(...)
请看这个例子并尝试不同的值(与2或0相反以引发异常,并使用trap_exit或不):
-module(play).
-compile(export_all).
start() ->
process_flag(trap_exit, true),
spawn_link(?MODULE, inverse, [2]),
loop().
loop() ->
receive
Msg -> io:format("~p~n", [Msg])
end,
loop().
inverse(N) -> 1/N.
主管使用链接和陷阱出口,以便他们可以跟踪他们的孩子,并在必要时重新启动他们。 儿童流程并不需要让出口管理人员妥善管理出口,实际上,他们只有在他们明确需要知道某些流程与其相关的流程死亡,而且他们不想让自己崩溃时才会陷入困境。
OTP行为能够妥善处理监督,如果他们被困或被困。
在Erlang中,进程可以链接在一起。 这些链接是双向的。 只要进程死亡,它就会向所有链接进程发送一个退出信号。 这些进程中的每一个都会启用或禁用trapexit标志。 如果标志被禁用(默认),链接的进程一旦获得退出信号就会崩溃。 如果已经通过调用system_flag(trap_exit, true)
启用了该标志,则进程将把接收到的退出信号转换为退出消息,并且不会崩溃。 退出消息将在其邮箱中排队并作为正常消息处理。
如果您使用的是OTP主管,他们会为您处理trap_exit标志和细节,因此您不必关心它。
如果你正在实施一个监督机制,这可能是屏幕播放的内容(没有看到它),你将不得不照顾trap_exit的事情。
链接地址: http://www.djcxy.com/p/38177.html上一篇: exit, true)
下一篇: Will Xamarin Android execute OnCreateView when the IntPtr constructor is called?