Erlang gen_server进程花样作死
本文主要记录各种情况下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可以减少与本身事务无关的代码量,设计 ...
随机推荐
- idea历史版本下载
https://confluence.jetbrains.com/display/IntelliJIDEA/Previous+IntelliJ+IDEA+Releases
- Android开发——Toast知识
Toast.makeText(this, "内容", Toast.LENGTH_SHORT).show(); 直接显示一个Toast,第三个参数是时间的长短,还有一个Toast.L ...
- 【java设计模式】【创建模式Creational Pattern】工厂方法模式Factory Method Pattern(多态性工厂模式Polymorphic Factory Pattern、虚拟构造子模式Virtual Constructor Pattern)
public class Test { public static void main(String[] args){ Creator ca=new ConcreteCreatorA(); ca.cr ...
- Java面试题汇总
第一阶段:三年我认为三年对于程序员来说是第一个门槛,这个阶段将会淘汰掉一批不适合写代码的人.这一阶段,我们走出校园,迈入社会,成为一名程序员,正式从书本 上的内容迈向真正的企业级开发.我们知道如何团队 ...
- CJOJ 免费航班
Description 小Z在MOI比赛中获得了大奖,奖品是一张特殊的机 票.使用这张机票,可以在任意一个国家内的任意城市之间的免费飞行,只有跨国飞行时才会有额外的费用.小Z获得了一张地图,地图上有城 ...
- bzoj 3597: [Scoi2014]方伯伯运椰子
Description Input 第一行包含二个整数N,M 接下来M行代表M条边,表示这个交通网络 每行六个整数,表示Ui,Vi,Ai,Bi,Ci,Di 接下来一行包含一条边,表示连接起点的边 Ou ...
- TensorFlow 代码行统计
https://github.com/tensorflow/tensorflow.git
- badboy 录制脚本并并发脚本
很久没有研究过接口相关的工具了,一个偶然的机会听说了 badboy,可以录制jemter脚本, 查了资料 还可以并发,于是乎,实践才知道. http://www.badboy.com.au/ 官网,我 ...
- tornado 学习笔记
import tornado.ioloop import tornado.web class MainHanlwe(tornado.web.RequestHandler): def get(self) ...
- ajax调用数据案例,二级联动
题目:请针对移动端web浏览器制作一个结账数据信息展示页面 要求: 1. 页面样式除不使用表格呈现外,可自由选择其他呈现方式 2. 需符合移动端操作习惯 3. 可根据服务区.门店查询结账信息 4. 可 ...