Definitions
Exit signals are sent when processes crash
Exit Signals propagate through Links
Processes can trap exit signals
Complex Exit signal Propagation
Robust Systems can be made by Layering
Primitives For Exit Signal Handling
A Robust Server
Allocator with Error Recovery
Allocator Utilities
Definitions定义
Link 双向信号?
Exit Signal 传递进程结束信息
Error trapping 进程正确处理各种退出信号
Exit signals are sent when processes crash
进程异常崩溃时向所有连接进程发出错误信号
Exit Signals propagate through Links
如果进程连接方式如下:
A->B->C->D-E
那进程A崩溃会将Exit signal发送到B,如果B没有处理此信号而崩溃,则会依次传递下去
Processes can trap exit signals
如果进程处理了错误信号,则不会传递下去
Exit Signal Propagation Semantics
- 进程结束时,会产生一个正常或异常的退出信号,发送给所有连接的进程
- 进程在遇到没处理的异常退出信号时会崩溃,然后同样将信号传递给所有连接的进程
- 进程在一个receive操作中处理所有可能的信号
- BIFs和模式匹配出现的Error会发送自动退出信号给连接进程
Robust Systems can be made by Layering
分层创建系统可以使我们创建一个鲁棒的系统,如Level1处理所有Level2层的信号,Level2处理所有应用层的信号
一个设计优良的系统,我们可以不用写任何错误处理代码,因为错误能在底层被处理掉
Primitives For Exit Signal Handling
link(Pid)在进程自身和Pid进程之间创建一个双向连接
process_flag(trap_exit,true) 当前进程将错误信号转换成退出信号,可以被receive操作接收
exit(Reason)如:exit(failed_to_connect),其中exit(normal)表示接收信号的进程可以忽略此信号
A Robust Server
%如下的代码,客户端发出alloc以及release分别代表申请资源以及释放资源,如果在中途客户端崩溃掉,则资源得不到释放 top(Free, Allocated) -> receive {Pid, alloc} -> top_alloc(Free, Allocated, Pid); {Pid ,{release, Resource}} -> Allocated1 = delete({Resource,Pid},Allocated), top([Resource|Free], Allocated1) end. top_alloc([], Allocated, Pid) -> Pid ! no, top([], Allocated); top_alloc([Resource|Free], Allocated, Pid) -> Pid ! {yes, Resource}, top(Free, [{Resource,Pid}|Allocated]).
Allocator with Error Recovery
%下面的代码就处理了EXIT错误信息,并清除了资源 top_recover_alloc([], Allocated, Pid) -> Pid ! no, top_recover([], Allocated); top_recover_alloc([Resource|Free], Allocated, Pid) -> %% No need to unlink. Pid ! {yes, Resource}, link(Pid), top_recover(Free, [{Resource,Pid}|Allocated]). top_recover(Free, Allocated) -> receive {Pid , alloc} -> top_recover_alloc(Free, Allocated, Pid); {Pid, {release, Resource}} -> unlink(Pid), Allocated1 = delete({Resource, Pid}, Allocated), top_recover([Resource|Free], Allocated1); {'EXIT', Pid, Reason} -> %% No need to unlink. Resource = lookup(Pid, Allocated), Allocated1 = delete({Resource, Pid}, Allocated), top_recover([Resource|Free], Allocated1) end.
Allocator Utilities
delete(H, [H|T]) -> T; delete(X, [H|T]) -> [H|delete(X, T)]. lookup(Pid, [{Resource,Pid}|_]) -> Resource; lookup(Pid, [_|Allocated]) -> lookup(Pid, Allocated)
相关推荐
erlang编程指南学习笔记,包含具体操作命令例子
NULL 博文链接:https://jias.iteye.com/blog/615679
Joe的那篇erlang论文 Programming Erlang + 源码包 Erlang Programming Concurrent Programming in Erlang efficiecy guide 资源齐全.希望能帮到你.
erlang学习资料
NULL 博文链接:https://xiajs.iteye.com/blog/1871551
erlang学习3erlang学习3erlangerlang学erlang学习3习3学习3
Erlang学习资料,2本书,不用卖书,电子书足够了
erlang 程序设计一书的笔记,帮你快速重温erlang的知识点。
erlang学习2.pdferlang学习erlang学习2.erlang学习2.pdfpdf2.pdferlang学习2erlang学习2.pdf.pdf
资源名称:Erlang语音学习资料汇总资源目录:【】Erlang程序设计【】[ManningPublications]ErlangandOTPinAction【】[NoStarchPress]LearnYouSomeErlangforGreatGood!ABeginner'sGuide【】[O'ReillyMedia]...
学习erlang 开发游戏利器 erlang学习文档 erlang学习工具
erlang学习4.pdferlang学习4.erlang学习4erlang学习4.pdf.pdfpdferlang学习4.pdf
erlang学习1.pdferlang学习erlang学erlang学习1.pdf习1.pdf1.pdf
用于erlang学习资源 一些基本的语言
本文是一篇关于Redis全套学习笔记的文章,主要介绍了Redis的基础知识、数据结构、持久化、集群、高可用、性能优化等方面的内容。通过本文的学习,读者可以全面掌握Redis的使用和应用,提高自己的技术水平和实践能力...
erlang 连接学习例子 最简单的通讯例子
erlang入门电子书 erlang编程 Introducing Erlang,作者Simon.St.Laurent
很不错的erlang学习资料。推荐刚上手的同学下载学习。
erlang 安装包