`

erlang学习笔记(错误处理)

 
阅读更多

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

  1. 进程结束时,会产生一个正常或异常的退出信号,发送给所有连接的进程
  2. 进程在遇到没处理的异常退出信号时会崩溃,然后同样将信号传递给所有连接的进程
  3. 进程在一个receive操作中处理所有可能的信号
  4. 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 学习笔记1

    【标题】"Erlang 学习笔记1" 在深入探讨Erlang这一强大的并发编程语言之前,我们先来理解一下Erlang的基本概念。Erlang是由瑞典电信设备制造商Ericsson开发的一种函数式编程语言,它最初设计的目的是为了处理分布式...

    erlang学习笔记

    ### Erlang学习笔记:深入解析Erlang编程与系统管理 #### 1. Erlang编程基础与资源 在深入探讨Erlang编程之前,我们首先需要了解一些基础资源和学习资料。Erlang官方网站([www.erlang.org](http://www.erlang.org...

    erlang学习相关资料

    Joe的那篇erlang论文 Programming Erlang + 源码包 Erlang Programming Concurrent Programming in Erlang efficiecy guide 资源齐全.希望能帮到你.

    Scala、Groovy++、Stackless Python、Erlang 学习笔记及分享

    学习Scala,你需要理解其静态类型的特性、模式匹配、 Actors模型以及类型系统,包括高阶函数、特质(traits)和不可变数据结构。 Groovy是另一种基于JVM的动态编程语言,它的语法简洁,易于阅读和编写。Groovy与...

    erlang学习资料

    Erlang是一种面向并发的、函数式编程语言,由瑞典电信...总的来说,Erlang的学习涉及函数式编程思想、并发处理、分布式系统设计等多个方面,深入学习并实践这些知识点,将使你具备开发高效、可靠的并发应用程序的能力。

    Erlang学习资料

    - **容错性**:Erlang支持热更新和软实时系统,能够很好地处理错误和异常情况,这对于构建高可用性和高可靠性的多核应用至关重要。 #### 三、Erlang多核编程实践案例分析 - **工业实例**:Erlang已经在多个行业中...

    Erlang游戏程序学习完整PDF手册

    4. **简单错误处理**:Erlang的错误处理机制鼓励“失败快速”,即尽早发现并处理错误,而不是隐藏它们,这样有利于编写出更健壮的代码。 5. **模式匹配**:Erlang的模式匹配功能使得数据处理更加简洁高效,对于游戏...

    erlang 笔记

    ### Erlang程序设计知识点概述 #### 1. Erlang基础语法与函数定义 ...Erlang是一门非常强大且灵活的语言,尤其适合处理并发和分布式系统。通过掌握这些基本概念和高级特性,可以有效地利用Erlang解决实际问题。

    Erlang语音学习资料汇总

    资源名称:Erlang语音学习资料汇总资源目录:【】Erlang程序设计【】[ManningPublications]ErlangandOTPinAction【】[NoStarchPress]LearnYouSomeErlangforGreatGood!ABeginner'sGuide【】[O'ReillyMedia]...

    xiandiao_erlang_Erlang课后习题_

    4. **错误处理与恢复**:习题可能设计为在遇到错误时,系统能优雅地处理并恢复,让学习者理解Erlang中的错误处理策略。 5. **模块化编程**:Erlang的模块系统可以帮助组织代码,习题可能要求学习者将功能分解到多个...

    erlang编程 Introducing Erlang

    Simon St. Laurent的《Introducing Erlang》这本书深入浅出地介绍了这些概念,是学习Erlang的理想起点。通过阅读这本书,读者将能够理解Erlang如何处理并发、分布式计算和故障恢复,从而构建高效、健壮的软件系统。

    erlang 连接学习例子

    在这个“erlang 连接学习例子”中,我们有两个核心文件:`server.erl` 和 `client.erl`,它们分别代表了一个服务器进程和客户端进程,展示了Erlang中进程间的通信机制。 `server.erl` 文件通常包含一个持续运行的...

    Erlang学习资源

    用于erlang学习资源 一些基本的语言

    Redis全套学习笔记 (带章节目录) 完整版pdf

    本文是一篇关于Redis全套学习笔记的文章,主要介绍了Redis的基础知识、数据结构、持久化、集群、高可用、性能优化等方面的内容。通过本文的学习,读者可以全面掌握Redis的使用和应用,提高自己的技术水平和实践能力...

    erlang资源

    3. **错误处理与容错**:Erlang推崇“let it crash”哲学,鼓励程序在遇到错误时快速失败并重启,而不是尝试修复。书里可能会讨论如何构建健壮的系统,利用Erlang的故障隔离特性。 4. **分布式编程**:Erlang进程...

    erlang入门学习经典资料(很不错)

    ### Erlang 入门学习经典资料解析 #### Erlang 的神秘与起源 Erlang,作为一门相对小众但极具特色的编程语言,自问世以来便伴随着一种神秘的气息。这种神秘感不仅源于它独特的编程范式——函数式编程,还在于其...

    Erlang_CNode用户指

    5. **错误处理和调试**:讨论在CNode中处理Erlang错误和异常的方法,以及如何利用Erlang的调试工具来排查问题。 6. **性能优化**:提供关于如何最大限度地提高CNode与Erlang节点之间通信效率的提示和最佳实践。 7....

    erlang 部分源码

    Erlang中的错误处理是通过异常(exceptions)进行的。源码中可能包含错误处理和恢复的代码,展示了如何优雅地处理运行时错误。 5. **类型系统** 虽然Erlang是动态类型的语言,但它也有一些静态类型检查的特性。...

    erlang_版本24.3.4.4

    - **错误处理**:Erlang采用异常处理机制,鼓励编写无副作用的纯函数,有助于编写容错性强的代码。 - **模式匹配**:Erlang的模式匹配功能允许在函数定义中使用模式来匹配和解构数据结构,简化了代码编写。 - **...

Global site tag (gtag.js) - Google Analytics