Erlang进程的Link机制
这篇文章还不是最终版,有时间时,我会再来补充完善。
什么是link
Erlang程序基于进程建模,进程之间的交互机制有收发消息,link和monitor。其中,收发消息通常用于正常的进程间通讯,而link和monitor多用于异常情况处理,本文从应用的角度介绍和分析link机制。link是双向全联通的,用来将两个或多个进程绑定在一起,绑定在一起之后,VM会保证在有进程退出时,对与其绑定在一起的进程执行特定的操作。
创建link和取消link
Two processes can be linked to each other. A link between two
processes Pid1 and Pid2 is created by Pid1 calling the BIF
link(Pid2)(or vice versa). There also exists a number a spawn_link
BIFs, which spawns and links to a process in one operation.Links are bidirectional and there can only be one link between two
processes.Repeated calls to link(Pid) have no effect.
A link can be removed bycalling the BIF unlink(Pid).
当有进程退出时
发送Exit Signal
When a process terminates, it will terminate with an exit reason as
explained in Process Termination above. This exit reason is emitted in
an exit signal to all linked processes.A process can also call the function exit(Pid,Reason). This will
result in an exit signal with exit reason Reason being emitted to Pid,
but does not affect the calling process.
Exit Signal的默认处理方式
The default behaviour when a process receives an exit signal with an
exit reason other than normal, is to terminate and in turn emit exit
signals with the same exit reason to its linked processes. An exit
signal with reason normal is ignored
将Exit Signal转换为普通的进程消息
A process can be set to trap exit signals by calling:
process_flag(trap_exit, true)
When a process is trapping exits, it will not terminate when an exit
signal is received. Instead, the signal is transformed into a
message{'EXIT',FromPid,Reason} which is put into the mailbox of the
process just like a regular message.An exception to the above is if the exit reason is kill, that is if
exit(Pid,kill) has been called. This will unconditionally terminate
the process, regardless of if it is trapping exit signals or not.
link与OTP的关系
OTP作为Erlang官方的编程框架被广泛应用,在OTP的实现中,link机制被广泛的应用。
Erlang has a built-in feature for error handling between processes.
Terminating processes will emit exit signals to all linked processes,
which may terminate as well or handle the exit in some way. This
feature can be used to build hierarchical program structures where
some processes are supervising other processes, for example restarting
them if they terminate abnormally.Refer to OTP Design Principles for more information about OTP
supervision trees, which uses this feature.
gen_server
假设存在a,b两个进程,其中b是gen_server。我们在进程a中调用b:start_link(),使两个进程link在一起,然后来讨论一些异常情况。
- a进程正常退出 -> b进程正常运行
- a进程异常退出 -> b进程退出
- a进程正常退出, b进程中调用了process_flag(trap_exit, true) -> b进程不会收到exit msg,退出
- a进程异常退出, b进程中调用了process_flag(trap_exit, true) -> b进程不会收到exit msg,退出
- b进程正常退出 -> a进程正常运行
- b进程异常退出 -> a进程退出
- b进程正常退出, a进程中调用了process_flag(trap_exit, true) -> a进程收到{'EXIT',Pid_b,normal}
- b进程异常退出, a进程中调用了process_flag(trap_exit, true) -> a进程收到{'EXIT',Pid_b,Reason}
看起来第3项和第4项不太正常,似乎跟刚刚介绍的erlang link机制冲突了。出现这种现象的原因,是gen_server不是普通进程,它在一个普通的进程上,添加一些默认的行为,具体到这个问题,就是gen_server在收到来自父进程(>调用start_link>的进程)的{'EXIT',Pid_Parent,Reason}
decode_msg(Msg, Parent, Name, State, Mod, Time, Debug, Hib) ->
case Msg of
{system, From, get_state} ->
sys:handle_system_msg(get_state, From, Parent, ?MODULE, Debug,
{State, [Name, State, Mod, Time]}, Hib);
{system, From, {replace_state, StateFun}} ->
NState = try StateFun(State) catch _:_ -> State end,
sys:handle_system_msg(replace_state, From, Parent, ?MODULE, Debug,
{NState, [Name, NState, Mod, Time]}, Hib);
{system, From, Req} ->
sys:handle_system_msg(Req, From, Parent, ?MODULE, Debug,
[Name, State, Mod, Time], Hib);
{'EXIT', Parent, Reason} ->
terminate(Reason, Name, Msg, Mod, State, Debug);
_Msg when Debug =:= [] ->
handle_msg(Msg, Parent, Name, State, Mod);
_Msg ->
Debug1 = sys:handle_debug(Debug, fun print_event/3,
Name, {in, Msg}),
handle_msg(Msg, Parent, Name, State, Mod, Debug1)
end.
link与业务建模
待续
Erlang进程的Link机制的更多相关文章
- erlang进程监控:link和monitor
Erlang最开始是为了电信产品而发展起来的语言,因为这样的目的,决定了她对错误处理的严格要求.Erlang除了提供exception,try catch等语法,还支持Link和Monitor两种监控 ...
- Erlang进程堆垃圾回收机制
原文:Erlang进程堆垃圾回收机制 作者:http://blog.csdn.net/mycwq 每一个Erlang进程创建之后都会有自己的PCB,栈,私有堆.erlang不知道他创建的进程会用到哪种 ...
- 深入理解docker的link机制
https://yq.aliyun.com/articles/55912 摘要: 什么是docker的link机制 同一个宿主机上的多个docker容器之间如果想进行通信,可以通过使用容器的ip地址来 ...
- 从Erlang进程看协程思想
从Erlang进程看协程思想 多核慢慢火了以后,协程类编程也开始越来越火了.比较有代表性的有Go的goroutine.Erlang的Erlang进程.Scala的actor.windows下的fibr ...
- erlang进程与操作系统线程
erlang多进程与多线程: 在erlang开发中,我们面对的最小执行单位是进程,当然这个进程并不是系统层面上的进程,也不是线程.而是基于erlang运行时系统的一个进程.那么erlang的多进程是如 ...
- erlang进程概述
一.概述 与大多数的进程相反,Erlang中的并发很廉价,派生出一个进程就跟面向对象的语言中分配一个对象的开销差不多. 在启动一个复杂的运算时,启动运算.派生进程以及返回结果后,所有进程神奇的烟消云散 ...
- Linux进程组调度机制分析【转】
转自:http://oenhan.com/task-group-sched 又碰到一个神奇的进程调度问题,在系统重启过程中,发现系统挂住了,过了30s后才重新复位,真正系统复位的原因是硬件看门狗重启的 ...
- 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制【转】
本文转载自:https://blog.csdn.net/freekiteyu/article/details/70082302 Android-Binder进程间通讯机制 概述 最近在学习Binder ...
- Android Binder 进程间通讯机制梳理
什么是 Binder ? Binder是Android系统中进程间通讯(IPC)的一种方式,也是Android系统中最重要的特性之一.Binder的设计采用了面向对象的思想,在Binder通信模型的四 ...
随机推荐
- windows下用golang连接mssql
版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 安装Microsoft SQL Server Native Client 安装golang的mssql驱动 写测试代码 ...
- linux云主机怎么安装WDCP
linux云主机 教你成功安装WDCP的2个方法(第一个不成功就试第2个) 工具/原料 Xshell 云服务器 方法/步骤 1 先用Xshell连接你的服务器 2 输入一下代码 wget ...
- 解决 01-Jul-2016 10:49:05.875 WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc The web application [ROOT] registered the JDBC driver [com.mysql.jdbc.D
01-Jul-2016 10:49:05.875 WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoade ...
- 奇怪吸引子---Sakarya
奇怪吸引子是混沌学的重要组成理论,用于演化过程的终极状态,具有如下特征:终极性.稳定性.吸引性.吸引子是一个数学概念,描写运动的收敛类型.它是指这样的一个集合,当时间趋于无穷大时,在任何一个有界集上出 ...
- VS2010在运行状态下编辑代码
在VS2010环境下,当程序处于调试运行状态时,编辑代码会出现下图提示框: 这就给边编辑代码边查看程序运行效果带来不便. 解决方法:在程序没有运行的时候,打开菜单“工具”——>“选项”——> ...
- 一篇文章,读懂 Netty 的高性能架构之道
原文 Netty是一个高性能.异步事件驱动的NIO框架,它提供了对TCP.UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机 ...
- UICollectionView瀑布流的实现原理(转)
http://ios.jobbole.com/85689/ 和使用 UIScollView 创刊一个瀑布流是一样的方式 7cc829d3gw1f4nq2oc09zj20j00hvq90.jpg 我的 ...
- Django模块学习- django-pagination
实在是很简单的一个Django 的分页插件. 使用pip instal pagination 即可完成安装. 完成后配置如下: 1. 将安装文件中的 pagination 文件夹拷贝到项目的根目录下 ...
- Linux64位服务器编译安装MySQL5.6(CentOS6.4)
首先到MySQL官网下载MySQL最新版(目前是mysql-5.6.12)上传到服务器上,下面说一下详细的安装过程. 安装依赖包,可以在线更新也可以配置本地源(CentOS本地源配置)yum -y i ...
- Gson整合Volley返回对象--GsonRequest
Gson是一个使用映射支持JSON与Java对象之间相互转换的库文件.你可以定义和JSON keys相对应名称的Java对象.把对象传递给传递Gson,然后Gson会帮你为对象填充字段值. 下面是一个 ...