这一章有三个关键的概念:link,exit signal, system process,现在就对这些做个总结:
通常一个process是由另一个process创建,若我们不做任何处理,那么新创建的process(我们称:子process)和创建它的process(我们称:父process),在创建完成后将没有任何关系,任何瓜葛,生老病死都不会被对方感知,但是若我们有这样这一种需求(我工作中就有)某个线程执行一个很重要的task,若在执行过程中因为某个原因挂掉了,这种情况需要被感知并且重启继续执行。若是其他语言,我没想到什么好的方法,但是erlang确天然的提供这种支持(这也是它能够构建容错系统的原因),而它提供的支持手段就是
link.
那什么是link呢? 譬如有两个process:Pid_A和Pid_B,当Pid_A调用link(Pid_B)方法时,就在Pid_A和Pid_B之前建立了一条“虚拟连接”,Pid_A就能够感知Pid_B的生老病死(注意,这个连接是
双向的,B挂了会告诉A,A挂了它也会告诉B,它们互相监督)
那么当B挂了,它是怎么告诉A的呢?并且A得知B挂了,它又如何处理?
process B挂掉的时候,会向link到它的所有processes广播一个
exit signal,在这个exit signal中就包含process B为什么挂掉的原因,我们有几种方式设置这个挂掉的原因:
显示方式:
exit(Reason) 当前process结束并且exit reason为参数Reason
exit(Pid, Reason) 向Pid process发送一个exit signal并且exit reason 为参数Reason
隐式方式:
程序抛runtime error,Reason被自动设置成刚才抛错原因
注意:若process正常退出,exit signal Reason为normal,这种exit signal不会对其他process(linked)有任何影响
当process A收到一个exit signal后,若它只是一个普通process,它将以同样Reason结束掉自己(这就叫不求同日生,但求同日死),但是如果link只有这种作用,那么它完全不能完成我们刚才说的那个需求:监督->发现process挂掉->重启。嘿嘿,这就是我们要说的最后一个概念:
system process。
若process A 是一个system process,当他收到exit signal,它将不会结束自己,而是把exit signal转变为一条{'EXIT',From,Reason}消息,放入到自己的mail-box中(其中参数From代表是哪个Process挂掉了,Reason表示挂掉的原因),也就是说system process能够捕获exit signal(而不是简单结束自己),这样当我们捕获到exit signal时(即收到一条{'EXIT',From,Reason}消息),就可以做出相应处理(譬如重启),从而起到监控作用。
注意:若exit signal Reason为kill,那么这个exit signal将不能被捕获,即使你是system process;
(以上是书上说的,但是我自己的测试结果是:调用exit(kill)发出的exit signal依然能够被system process捕获,而exit(Pid, kill)发出的exit signal是不能够被捕获的,关于这点,希望能跟大家求证)
现在贴下《Programming Erlang》中的一张图,它更清楚的说明了上述情况:
ps:process_flag(trap_exit, true) 可以把一个普通process变为system process
最后,文中稍微涉及了一些race condition的概念(譬如两个process同时register(erl, Pid)),自己网上找了一帖子,说的还比较清楚:
http://stackoverflow.com/questions/4366826/avoiding-a-race-condition
- 大小: 29.6 KB
分享到:
相关推荐
在《Erlang并发编程》一书中,详细介绍了Erlang语言的核心并发模型和编程范式,包括但不限于串行编程、进程创建、进程间通信、分布式编程以及错误处理等。书中指出Erlang的并发性能得益于其轻量级进程,这些进程是由...
Erlang并发编程是Erlang语言的核心特性之一,它为构建高效、容错的分布式系统提供了强大的工具。Erlang是一种函数式编程语言,特别适合处理并发和实时系统,因其在电信行业的广泛应用而闻名。以下是一些关于Erlang...
《Erlang并发编程》是一本深入探讨Erlang编程语言并发特性的书籍,中文翻译版为《erlang并发编程中文翻译(cpie-cn...书中涵盖了Erlang并发编程的基础概念、高级技巧以及实际案例,是深入理解Erlang并发特性的宝贵资源。
**GenServer** 行为是一种常用的服务器模式,它简化了状态管理和错误处理。GenServer提供了异步调用、同步调用和cast(单向消息发送)等多种交互方式,以及状态的存储和更新机制。 **GenEvent** 行为则用于构建事件...
通过轻量级进程、消息传递和强大的错误处理机制,Erlang使得并发编程变得简单而强大。随着多核处理器的普及,Erlang的并发模型越来越受到重视,被广泛应用于实时系统、分布式系统和互联网应用的开发中。
Erlang OTP并发编程实战是深入理解Erlang并发特性和 OTP(Open Telephony Platform)设计原则的关键资源。这本书的附书源码包含了14个章节的实例代码,旨在帮助读者通过实践掌握Erlang在分布式系统、容错以及高并发...
这个“erlang资源”包含两本PDF书籍——《Erlang并发编程》和《Erlang入门手册》,它们是深入理解和学习Erlang语言的关键资料。 《Erlang并发编程》这本书可能涵盖了以下知识点: 1. **并发模型**:Erlang的并发...
书是讲述下一代编程语言Erlang 的权威著作,主要涵盖顺序型编程、异常处理、编译和运行代码、并发编程、并发编程中的错误处理、分布式编程、多核编程等内容。本书将帮助读者在消息传递的基础上构建分布式的并发系统...
它包括行为(如GenServer、GenEvent和Supervisor)、应用和系统结构的指导原则,以及错误处理机制。 ### 4. 链接与监控 Erlang中的链接(Linking)和监控(Monitoring)机制允许进程间建立关系,以便在另一进程...
4. **简单错误处理**:Erlang的错误处理机制鼓励“失败快速”,即尽早发现并处理错误,而不是隐藏它们,这样有利于编写出更健壮的代码。 5. **模式匹配**:Erlang的模式匹配功能使得数据处理更加简洁高效,对于游戏...
CNode提供了一种方式,使得开发者可以利用Erlang的并发特性和强大错误处理能力,同时利用C语言的高效性能和库资源。CNode的主要功能包括创建Erlang进程,发送和接收消息,以及调用Erlang的函数。 **Erlang_CNode...
进程间通信通过消息传递实现,这是Erlang并发模型的核心。 2. **故障恢复与容错**:Erlang支持热代码替换,可以在运行时更新代码而不会中断服务。此外,进程之间独立运行,一个进程的崩溃不会影响其他进程,这使得...
第一部分介绍Erlang语言的基础知识,包括其语法特性、并发模型和错误处理策略。读者将了解Erlang的模式匹配、函数式编程概念以及如何利用轻量级进程进行并发编程。第二部分深入探讨OTP,讲解其设计原则和组件,如...
4. **错误处理与恢复**:习题可能设计为在遇到错误时,系统能优雅地处理并恢复,让学习者理解Erlang中的错误处理策略。 5. **模块化编程**:Erlang的模块系统可以帮助组织代码,习题可能要求学习者将功能分解到多个...
OTP库提供了许多实用的模块,如gen_server、gen_event和gen_fsm,这些都是Erlang并发编程的基础。 总而言之,Erlang9.rar是一个包含Erlang/OTP 20.0 Windows 64位安装程序的压缩包,主要用于安装Erlang环境,以...
4. **错误处理与容错**:Erlang的设计哲学是“失败快速,恢复快速”。这意味着系统应该预期到错误并准备好优雅地处理它们,而不是避免错误。Erlang提供了异常处理机制和错误恢复策略,这在面对软件错误时显得尤为...
Erlang的错误处理机制鼓励“let it crash”哲学,即快速失败并恢复,以保持系统的整体稳定性。 最后,书中包含了一些实际项目案例,如电话交换机系统,展示了Erlang在实际场景中的应用。通过这些案例,读者可以更好...
- **OTP(Open Telephony Platform)**:Erlang的核心库,包含大量预先设计的模块,用于处理常见的系统任务,如错误处理、分布式计算和监控。 - **行为模式**:如GenServer、GenEvent和Gen_fsm,它们定义了Erlang中...