本文主要记录各种情况下gen_server进程退出的表现。
研究动机起源于Elixir/Phoenix框架中遇到的一个进程异常退出问题。因为网络异常,客户端超过一段时间未发来消息,channel进程(一个gen_server)退出了,但是挂的很突兀,不调用 terminate,进而导致掉线处理没被调用,表现出一堆bug。分析发现它是被shutdown的,而一个gen_server如果没有trap_exit,被shutdown就不会调用terminate。
Anyway,实验了各种组合,仅以此做个记录。个中缘由有兴趣的可以阅读源码。
Process.exit
trap_exit不为true
当trap_exit不为true时,Process.exit(Pid, normal) 只有在自身调用时才会退出,其他进程中调用不会导致退出。而除normal外的其他任何一种Reason都会导致进程退出。
trap_exit=true
当trap_exit=true时,所有Reason都会导致进程退出,也就是说其他进程也能用 normal 退出该进程。
Reason=kill 时 terminate 回调不会被调用,而Reason为其他值均会调用。
Reason 不属于 normal、shutdown、kill时,还会触发gen_server的exit log。
主动退出
主动退出是指进程主动在回调中返回 {stop, Reason, State} 的情况。
这种情况下,所有Reason都会触发 terminate 回调,而除 normal 和 shutdown 外,其他Reason都会触发gen_server的exit log。
父进程退出
trap_exit不为true
当trap_exit不为true时,父进程退出相当于Process.exit(Pid, Reason) 情况。由于不是自身调用,normal不会导致子进程死亡,其他理由均会导致进程死亡,并且不会调用 terminate 回调。
trap_exit=true
当trap_exit=true时,所有Reason都会导致进程退出,并且所有Reason都会触发 terminate 回调。
除 normal 和 shutdown外,其他Reason均会触发gen_server的exit log。
子进程退出对父进程的影响
以上所有的退出方式中,只有退出理由为 normal ,才不会往父进程辐射死亡信号。
而父进程收到死亡信号,如果父进程trap_exit不等于true,则会以同一理由随之死亡并往上传递,如trap_exit=true,则变为父进程收到一条 {'EXIT', 进程pid,退出理由} 消息。
Erlang gen_server进程花样作死的更多相关文章
-
[Erlang09]Erlang gen_server实现定时器(interval)的几种方法及各自的优缺点?
方法1: %%gen_server:部分call_back function. -define(TIME,1000). init([]) –> erlang:send_after(?TIME,s ...
-
erlang 200w进程测试
参照<programing erlang>书例子,测试erlang创建进程性能 创建N个进程 都wait,然后挨个发送die关闭进程,代码如下: 测试场景:200w进程.MacBook P ...
-
Erlang实现进程池
开发工作中,经常会碰到进程池或者线程池,或者其它的资源池.在这里,用erlang实现一个简单的进程池. erlang进程是非常轻量级的,这个进程池的主要目的是用一种通用的方式去管理和限制系统中运行的资 ...
-
erlang 查看进程相关信息
出自: http://blog.sina.com.cn/s/blog_96b8a1540100zczz.html
-
erlang的进程池。
转自: http://blog.sina.com.cn/s/blog_96b8a1540101542m.html 主要组成部分: https://github.com/devinus/poolboy ...
-
erlang四大behaviour之一gen_server
来源:http://www.cnblogs.com/puputu/articles/1701017.html erlang程序设计里面有个设计原则就是把你的进程构造成树,把共用代码提出来,特定功能 ...
-
Erlang模块gen_server翻译
gen_server 概要: 通用服务器行为描述: 行为模块实现服务器的客户端-服务器关系.一个通用的服务器进程使用这个模块将实现一组标准的接口功能,包括跟踪和错误报告功能.它也符合OTP进程监控树. ...
-
Erlang generic standard behaviours -- gen_server hibernate
hibernate 主要用于在内存空闲时,通过整理进程的stack,回收进程的heap 来达到回收内存节省资源的效果. hibernate 可用于OTP 进程以及普通进程, hibernate 的官方 ...
-
erlang四大behaviour之一gen_server(转载)
erlang程序设计里面有个设计原则就是把你的进程构造成树,把共用代码提出来,特定功能用自己的module实现,这也就是behaviour了,应用behaviour可以减少与本身事务无关的代码量,设计 ...
随机推荐
-
C#程序设计---->;计算圆面积windows程序
值得说的就是添加一个回车事件, http://blog.csdn.net/nanwang314/article/details/6176604 private void textBox1_KeyDow ...
-
新浪SAE部署django博客
步骤: 第一步:注册新浪SAE账号(即新浪微博),下载TortoiseSVN 第二步:部署代码 使用SAE来部署代码,SAE提供的是PAAS层的云服务,即不是给你一个虚拟主机而是直接上传应用.进入SA ...
-
Redis rdb文件CRC64校验算法 Java实现
查看RDB文件结构,发现最后的8字节是CRC64校验算得,从文件头开始直到8字节校验码前的FF结束码(含),经过CRC64校验计算发现,貌似最后的8字节是小端模式实现的. 参考redis的crc64实 ...
-
八皇后问题-回溯法(MATLAB)
原创文章,转载请注明:八皇后问题-回溯法(MATLAB) By Lucio.Yang 1.问题描述 八皇后问题是十九世纪著名数学家高斯于1850年提出的.问题是:在8*8的棋盘上摆放8个皇后,使其不能 ...
-
MVC验证09-使用MVC的Ajax.BeginForm方法实现异步验证
原文:MVC验证09-使用MVC的Ajax.BeginForm方法实现异步验证 MVC中,关于往后台提交的方法有: 1.Html.BeginForm():同步 2.Ajax.BeginForm():异 ...
-
Linux 下杀毒可用工具 clamav
clamav 杀毒工具:Linux下可用的杀毒工具: 下载地址: 最新 包 0.101 官网下载地址:http://www.clamav.net/downloads最新包地址: https://cla ...
-
[转]Redis内部数据结构详解-sds
本文是<Redis内部数据结构详解>系列的第二篇,讲述Redis中使用最多的一个基础数据结构:sds. 不管在哪门编程语言当中,字符串都几乎是使用最多的数据结构.sds正是在Redis中被 ...
-
Oracle基本命令大全
用户: scott/tiger sys as sysdba 空密码 转换用户登录: connect 用户/密码 connect sys as sysdba 权限 用户解锁: alter user ...
-
Android View 深度分析requestLayout、invalidate与postInvalidate
前言 前几篇文章中,笔者对View的三大工作流程进行了详细分析,而这篇文章则详细讲述与三大工作流程密切相关的两个方法,分别是requestLayout和invalidate,如果对Viwe的三个工作流 ...
-
两个kernel.org国内镜像
两个kernel.org国内镜像 https://mirror.tuna.tsinghua.edu.cn/kernel/v4.x/testing/ http://mirror.bjtu.edu.cn/ ...