`
cwqcwk1
  • 浏览: 86864 次
文章分类
社区版块
存档分类
最新评论

erlang进程trap_exit捕获异常退出

 
阅读更多

Erlang除了提供try catch,catch等语法,还支持link和monitor两种监控进程的机制,使得所有进程可以连接起来,组成一个整体。除了这样,erlang还提供trap_exit方法让进程主动捕获异常退出消息,避免发生异常时被系统关闭。

trap_exit说明

erlang设计上有速错(fast on fail)的原则,就是让问题快速暴露,迅速停止这个进程的运行,以避免这个进程错误执行造成更多的错误。但是在业务层需要容错,所以erlang就把选择权交给用户,通过process_flag(trap_exit,true)来避免进程被异常关闭。

-module(test).
-compile(export_all).
start() ->
	Pid = spawn(
		fun() ->
			process_flag(trap_exit,true),
			do_loop()
		end),
	register(test, Pid).
	
do_loop() ->
	receive
		Msg ->
			io:format("recv ~w~n", [Msg])
	end,
	do_loop().

测试如下:

1> test:start().
true
2> exit(whereis(test),normal).
recv {'EXIT',<0.35.0>,normal}
true
3> whereis(test).
<0.33.0>
这里可以看出进程被exit/2 后并没有挂掉。

在exit/2的文档可以找到这么一段话:

exit(Pid, Reason) -> true

If Pid is not trapping exits, Pid itself will exit with exit reason Reason. If Pid is trapping exits, the exit signal is transformed into a message {'EXIT', From, Reason} and delivered to the message queue of Pid. From is the pid of the process which sent the exit signal.

意思是,如果进程没有trap_exit 的话,exit/2 就会直接关闭进程;如果设了trap_exit,进程不会被关闭,而是收到一条退出消息:{'EXIT', From, Reason}

trap_exit临界点

但是,有个问题,如果我们设了trap_exit,但是想强制关闭进程怎么办?

erlang还是给了我们答案:

If Reason is the atom kill, that is if exit(Pid, kill) is called, an untrappable exit signal is sent to Pid which will unconditionally exit with exit reason killed.

当exit/2 的Reason是kill时,进程就算设了trap_exit 也无法阻止进程被关闭

5> exit(whereis(test),kill).
true
6> whereis(test).
undefined

所以,kill被用来强制杀进程。以上也就是为什么gen_server进程被exit(Pid, kill) 时,terminate/2 无法捕获到进程退出消息的原因。

exit信号

再来说下trap_exit与进程退出信号的关系:


除了前面讲到的,还可以看出,不管进程是否有设置 trap_exit,进程被kill时link进程都会收到这个进程的退出消息。只要进程退出,link进程都会收到这个进程退出消息(normal除外),Supervisor就是这样构建起来的。那么,normal可以用来杀掉Supervisor的进程。

还有兴趣的,可以看下这两篇文章,Erlang/OTP 监督者(Supervisor)erlang进程监控:link和monitor


参考:http://blog.csdn.net/mycwq/article/details/41172863

分享到:
评论

相关推荐

    erlang-sd_notify-1.0-2.el7.x86_64.rpm

    erlang-sd_notify-1.0-2.el7.x86_64.rpm

    esl-erlang_23.0_windows_amd64.exe rabbitmq-server-3.8.4.exe

    esl-erlang_23.0和rabbitmq-3.8.4windows版本 直接下载安装就行,可以直接下载就可安装,非常的方便 ,欢迎大家下载 注意事项: 1. Erlang版本和RabbitMQ版本要配套 (Erlang23.0, RabbitMQ3.8.4) 2. amd芯片请乖乖...

    erlang_otp_win64_20.3.zip

    是erlang_otp_20.3 的win64安装包,内为exe文件,一路next即可安装完成 是适用于多线程、分布式开发的语言,也是如rabbitmq等重要工具的必须品 使用前需要配置环境变量:1.变量名为ERLANG_HOME,变量值为安装Erlang...

    esl-erlang_23.0_windows_amd64.exe

    这个erlang23.0版本,根据rabbitMQ官网的介绍,可以和下面这几个版本的rabbitMQ配合使用: 3.8.9 3.8.8 3.8.7 3.8.6 3.8.5 3.8.4 其他版本的rabbit,请移步其他资源下载

    Erlang_B_model.rar_Erlang B _Erlang B model_Wireless Handbook_e

    在这个压缩包中,我们有一个名为"Erlang_B_model.pdf"的文件,它很可能是这样的手册的一部分,提供了关于Erlang B模型的理论、公式以及查表方法。 **Erlang B公式**表达了一个服务系统(如电话交换机)在固定数量的...

    erlang_otp_win64_25.0

    在"erlang_otp_win64_25.0"这个标题中,我们可以提取出几个关键点: 1. **Erlang**:这是一种函数式编程语言,以其在处理并发性和容错性方面的强大能力而闻名。Erlang的设计理念是让程序员能够轻松地构建能够并行...

    分布式应用Erlang:Erlang_OTP_19_win64

    Erlang的设计灵感来源于通信领域的实际需求,其并发模型基于轻量级进程(processes),这些进程之间的通信是通过消息传递来实现的,这使得Erlang在处理大量并发连接时表现出色。OTP则在此基础上,提供了强大的行为...

    erlang_environment_win64_21.0.1.zip

    "erlang_environment_win64_21.0.1.zip" 是一个专门为Windows 10 64位操作系统提供的Erlang开发环境的安装包。这个压缩文件包含了两个关键组件:otp_win64_21.0.1.exe 和 erlang_environment_win64_21.0.1。 otp_...

    erlang_otp_20.3_man开发手册

    erlang_otp_20.3_man开发手册,erlang_otp_20.3_man开发手册,erlang_otp_20.3_man开发手册

    Erlang-Formula.zip_Erlang B _Erlang-B_erlang_erlang B计算_erlang C

    Erlang B 和 Erlang C 是在电信领域中广泛使用的两个数学公式,用于预测和管理电话交换系统的呼叫处理能力。这两个公式由丹麦工程师 Agner Krarup Erlang 在20世纪初开发,对于理解通信系统中的呼叫占用率、阻塞率和...

    erlang-syntax_tools-19.3.6.4-1.el7.x86_64.rpm

    erlang-syntax_tools-19.3.6.4-1.el7.x86_64.rpm

    erlang_otp_src_22.3.tar.gz

    首先,Erlang 语言以其独特的并发模型闻名,它使用轻量级进程(Lightweight Processes,LWP)来实现并发执行。这些进程具有低开销,使得在单个硬件上可以同时运行成千上万个进程。这使得 Erlang 在处理大规模并发...

    erlang_otp_22.2_win64&rabbitmq-server-3.8.3.zip

    标题中的"erlang_otp_22.2_win64"和"rabbitmq-server-3.8.3"提到了两个关键的IT技术:Erlang OTP和RabbitMQ服务器,这两个都是在分布式系统和消息队列领域非常重要的组件。 **Erlang OTP** Erlang是一种函数式编程...

    xiandiao_erlang_Erlang课后习题_

    "xiandiao_erlang_Erlang课后习题_"这个压缩包文件包含了Erlang程序设计第二版的课后习题源码,这对于学习和深入理解Erlang编程至关重要。 Erlang的特点: 1. **函数式编程**:Erlang基于函数式编程范式,强调无副...

    esl-erlang_19.3_osx_10.10_amd64.dmg

    标题“esl-erlang_19.3_osx_10.10_amd64.dmg”指的是一个特定版本的Erlang编程环境的安装镜像文件,由Erlang Solutions Limited(ESL)发布,适用于Apple macOS 10.10 Yosemite操作系统,并且是为64位AMD处理器设计...

    erlang_win_64位安装包

    在这个案例中,我们讨论的是"erlang_win_64位安装包",这意味着它是专为64位Windows操作系统设计的。32位和64位系统之间的兼容性问题需要引起注意,因此选择正确的版本至关重要,以免出现安装失败或运行不正常的情况...

    erlang-otp_win64_23.0.zip

    此版本为window64位下的,erlang23版本,erlang-otp_win64_23.0,官网原包,官网太难找了,好不容易找到,和大家分享下,需要的可以下载,也作为自己的一个记录吧,自己亲测很好用,erlang环境需要与对应的rabbitmq...

    erlang_otp_src_22.3.tar.gz+rabbitmq-server-3.8.3-1.el6.noarch.rpm.7z

    在给定的文件“erlang_otp_src_22.3.tar.gz”中,包含了Erlang OTP的源代码,版本为22.3。这个版本的发布通常会包含许多新特性、性能优化以及对已知问题的修复。源代码的获取对于开发者来说至关重要,因为这允许他们...

    erlang-gen_tcp手册

    erlang-gen_tcp手册,详细完整,网络tcp开发好东东

    erlang otp_src_20.2.tar.gz

    Erlang OTP的特性包括进程模型、分布式计算、热补丁、错误恢复和性能监控,这些都使得它成为构建高可用性和高可靠性系统的理想选择。RabbitMQ利用这些特性,提供了稳定、高效的消息传递服务。了解并熟练掌握Erlang ...

Global site tag (gtag.js) - Google Analytics