Erlang的gen_server的terminate()/2未执行

官方资料参考:

Module:terminate(Reason, State)

Types:

Reason = normal | shutdown | {shutdown,term()} | term()

State = term()

This function is called by a gen_server when it is about to terminate. It should be the opposite of Module:init/1 and do any necessary cleaning up. When it returns, the gen_server terminates with Reason. The return value is ignored.

Reason is a term denoting the stop reason and State is the internal state of the gen_server.

Reason depends on why the gen_server is terminating.

If it is because another callback function has returned a stop tuple {stop,..}, Reason will have the value specified in that tuple.

If it is due to a failure, Reason is the error reason.

If the gen_server is part of a supervision tree and is ordered by its supervisor to terminate, this function will be called with Reason=shutdown if the following conditions apply:

  • the gen_server has been set to trap exit signals, and
  • the shutdown strategy as defined in the supervisor‘s child specification is an integer timeout value, not brutal_kill.

Even if the gen_server is not part of a supervision tree, this function will be called if it receives an ‘EXIT‘ message from its parent. Reason will be the same as in the‘EXIT‘ message.

Otherwise, the gen_server will be immediately terminated.

实际场景:

gen_server的三个进程,A、B、C,其中A是B、C的父进程,即A进程调用的 B、C的  gen_server:start_link.

A、B、C三个进程全都未捕获 trap_exit,在C进程退出的时候  A、B进程的terminate()/2函数未执行。

原因分析:

参考官方资料可以知,如果一个gen_server进程不是监控树的一部分,gen_sever进程在收到父进程的 ‘EXIT‘信息时将会调用terminate()/2函数。

(注:不是只有收到父进程的 ‘EXIT‘信息时才会调用,别理解歧义)

需要设置 process_flag(trap_exit, true),link的进程死掉时,当前gen_server进程的handle_info()/2将会收到 :{‘EXIT‘,Pid,Reason}

代码修改:

在A、B进程对应的模块中添加 handle_info()/2 对 {‘EXIT‘,Pid,Reason} 的匹配,并 返回  {stop,Reason,NewState}

参考:

http://blog.csdn.net/zcc_0015/article/details/18054889

http://blog.sina.com.cn/s/blog_96b8a1540101314t.html

时间: 2024-10-21 12:25:00

Erlang的gen_server的terminate()/2未执行的相关文章

jQuery清除、停止队列中剩下(未执行的函数)

<!DOCTYPE html><html><head> <meta charset="utf-8"> <title>jQuery清除.停止队列中剩下(未执行的函数)</title> <script src="http://cdn.static.runoob.com/libs/jquery/1.10.2/jquery.min.js"> </script> <scrip

重置已分配未执行的任务(300,400-》200)

初始动作:重置所有已分配未执行的任务 1.删除/ZkTest/tasks/* 2.修改所有已分配未执行的任务记录 节点挂掉:监控父节点(/ZkTest/nodes)会感知,系统删除节点,回调通知程序 1.遍历修改子节点下的所有已分配未执行的任务记录 /ZkTest/tasks/${NodeKey}/TaskInst*** 2.修改对应的数据库记录 节点重连:节点重连回调会捕捉后修改zkNodekey(old->new) 1.遍历处理老zkNodeKey下的所有已分配未执行的任务记录 /ZkTes

Linux下安装Oracle网络配置检查未执行

问题描述 如图: 完整描述: Checking Network Configuration requirements ... Actual Result: Unknown Host Exception has Occurred :Linux-PC: Linux-PC. Check complete. The overall result of this check is: Not executed <<<< Recommendation: Oracle supports insta

一个多线程问题引发的血案-(代码段执行完毕,子进程未执行完毕导致段错误)

今天遇到一个问题,gdb执行程序完全没有问题,但直接执行就会段错误,百思不得其解,各种纠结,各种搜索引擎都试了一遍,无果!后来问题还是被我自己挖出来了. 看下边一段代码: int TaskSendControl() { pthread_t prov_thread[CLIENT_NUM]; int prov[CLIENT_NUM]; for(int i=0; i< CLIENT_NUM; i++) { prov[i] = i; if( pthread_create(&prov_thread[i

关闭页面,window.location事件未执行的原因

1.问题描述: JS中定义widow.location = function(),页面关闭时,logout()函数未执行. window.onunload = function() { logout(); } function logout(reqParam, callback){ var userManageServiceUrl = "http://" + getServerAddr() + "/axis2/services/UserManageService";

Oracle 11g 安装过程中“检查网络配置要求 未执行”解决方法

正在检查网络配置要求... 检查完成.此次检查的总体结果为: 未执行 网上查了一下,很多朋友都遇到这个问题而无从下手,其实解决起来很容易的. 只需要在 Windows XP 中安装 Microsoft LoopBack Adapter[Microsoft 环回适配器]就可以了. Microsoft 环回适配器是一种可用于在虚拟网络环境中进行测试的工具,在这样的环境中无法访问网络.另外,如果存在与网络适配器或网络适配器驱动程序的冲突,则必须使用环回适配器.可以将网络客户端.协议和其他网络配置项目绑

Quartz.NET 前一次任务未执行完成时不触发下次的解决方法

原文:Quartz.NET 前一次任务未执行完成时不触发下次的解决方法 如图所示,在Job 上 加     [DisallowConcurrentExecution]        特性 原文地址:https://www.cnblogs.com/lonelyxmas/p/11780421.html

记一次Laravel 定时任务schedul:run未执行的处理

关于Laravel的任务调度(定时任务)的配置在此不做赘述,跟着官方文档一步一步的操作是不会导致定时任务不能正常工作的. 为保证能及时捕获定时任务执行出现异常的原因,只需在配置系统crontab时指定日志文件即可.在执行中出现的任何问题都将会记录在你指定(任意区域,需注意权限)的日志当中.这对于寻找问题原因来说,是极为方便的. * * * * * cd /path-to-your-project && php artisan schedule:run >> 你的日志文件位置.l

[erlang 002]gen_server中何时会跑到terminate函数

1. 从start方法产出的独立gen_server进程 实验代码: %%%-------------------------------------- %%% @Module  : %%% @Author  : %%% @Email   : %%% @Created : %%% @Description: %%%-------------------------------------- -module(ter_a). -behaviour(gen_server). %% gen_server