gen_server的同步调用内部实现机制及From的前世今生

1、同步调用

首先客户端进程通过call向gen_server发起同步调用,客户端进程会monitor向gen_server进程,返回一个监控句柄Mref,同时向gen_server进程发送{Label,{self(),Mref},Request}后,客户端进程执行receive便进入阻塞状态,等待对应消息的到来。gen_server进程收到客户端发来的消息对其进行解析,解析出{self(),Mref}=From,即From是由客户端进程和客户端进程对gen_server的monitor句柄组成的一个元组,是客户端进程将自己的进程id发送给gen_server,gen_server解析出来后传给实现gen_server行为模式的同步回调接口,这就是From的前世今生,回调部分接口是在gen_server进程内部执行,通用部分接口是在客户端进程中执行。

客户端进程一直在侦听消息的到来,如果收到了同步调用的返回值,客户端进程是这样做的,首先执行demonitor解除与gen_server的监控关系,进而将结果返回,客户端进程从receive的阻塞状态跳出来,对外表现为同步调用返回;如果收到gen_server进程发来的{‘DOWN‘,Mref,_,_,Reason}消息,客户端进程马上exit;如果timeout时间后依旧没有没有收到结果,便自动demonitor后,退出。

总结:1、erlang底层之所以让客户端进程单向monitor目标gen_server进程,就是想在同步调用过程,让客户端与gen_server进程有个“握手-分手”的过程,一旦gen_server进程挂了,客户端进程能够收到DOWN消息,进而客户端进程退出;

2、当进程A与进程B既有link关系,又有A到B的monitor时,一旦B进程挂了,exit退出信号会优先‘DOWN’发给进程A。

时间: 2024-10-19 01:19:28

gen_server的同步调用内部实现机制及From的前世今生的相关文章

异步调用与回调机制,协程

1.异步调用与回调机制 上一篇我们已经了解到了两组比较容易混淆的概念问题,1.同步与异步调用 2.阻塞与非阻塞状态.在说到异步调用的时候,说到提交任务后,就直接执行下一行代码,而不去拿结果,这样明显存在缺陷,结果是肯定要拿的,这辈子都肯定是要拿到这个结果的,没有这个结果后面的活又不会干,没办法,只能去拿结果的,那么问题是异步调用提交任务后,如何实现既要拿到结果又不需要原地等的理想状态呢?专门为异步调用配备了一个方法--回调机制 先来想想我们之前是怎么拿到一个函数的结果,就传给另外一个函数取执行,

转:Java 动态代理的内部实现机制(大体意思正确,写的还行的一篇文章)

转:Java动态绑定的内部实现机制 JAVA虚拟机调用一个类方法时,它会基于对象引用的类型(通常在编译时可知)来选择所调用的方法.相反,当虚拟机调用一个实例方法时,它会基于对象实际 的类型(只能在运行时得知)来选择所调用的方法,这就是动态绑定,是多态的一种.动态绑定为解决实际的业务问题提供了很大的灵活性,是一种非常优美的机 制. 1 JAVA对象模型 JAVA虚拟机规范并没有规定JAVA对象在堆里是如何表示的.对象的内部表示也影响着整个堆以及垃圾收集器的设计,它由虚拟机的实现者决定. JAVA对

如何实现 javascript “同步”调用 app 代码

在 App 混合开发中,app 层向 js 层提供接口有两种方式,一种是同步接口,一种一异步接口(不清楚什么是同步的请看这里的讨论).为了保证 web 流畅,大部分时候,我们应该使用异步接口,但是某些情况下,我们可能更需要同步接口.同步接口的好处在于,首先 js 可以通过返回值得到执行结果:其次,在混合式开发中,app 层导出的某些 api 按照语义就应该是同步的,否则会很奇怪——一个可能在 for 循环中使用的,执行非常快的接口,比如读写某个配置项,设计成异步会很奇怪. 那么如何向 js 层导

HashMap的内部实现机制,Hash是怎样实现的,什么时候ReHash

1.HashMap的内部实现机制 HashMap是对数据结构中哈希表(Hash Table)的实现,Hash表又叫散列表.Hash表是根据关键码Key来访问其对应的值Value的数据结构,它通过一个映射函数把关键码映射到表中一个位置来访问该位置的值,从而加快查找的速度.这个映射函数叫做Hash函数,存放记录的数组叫做Hash表. 在Java中,HashMap的内部实现结合了链表和数组的优势,链接节点的数据结构是Entry<k,v>,每个Entry对象的内部又含有指向下一个Entry类型对象的引

HashMap的内部实现机制,Hash是怎样实现的,什么时候ReHash - schbook

1.HashMap的内部实现机制 HashMap是对数据结构中哈希表(Hash Table)的实现, Hash表又叫散列表.Hash表是根据关键码Key来访问其对应的值Value的数据结构,它通过一个映射函数把关键码映射到表中一个位置来访问该位置的值,从而加快查找的速度.这个映射函数叫做Hash函数,存放记录的数组叫做Hash表. 在Java中,HashMap的内部实现结合了链表和数组的优势,链接节点的数据结构是Entry<k,v>,每个Entry对象的内部又含有指向下一个Entry类型对象的

MFC第一节-windows程序内部运行机制

一.窗口 设计窗口类时: 1 typedef struct _WNDCLASS{ 2 UINT style; //如水平.垂直变化是否重绘,禁用Close,检测双击 3 WNDPROC lpfnWndProc;//窗口过程函数句柄 4 int cbClsExtra;//类附加内存 5 int cbWndExtra;//窗口附加内存 6 HANDLE hInstance;//实例句柄 7 HANDLE hIcon;//图标 8 HCURSOR hCursor;//光标 9 HBRUSH hbrBa

java三种调用方式(同步调用/回调/异步调用)

1:同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用 2:回调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口: 3:异步调用:一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口 ) 实例2:老师平时学生布置任务后不可能一直等待和监督学生完成,老师通常会告诉学生,任务完成后给他打个电话或者发个信息,那么学生给老师返回结果的过程需要老师信息,这就是一个回调的过程.

【JS】JavaScript引擎的内部执行机制

 近期在复习JavaScript,看到setTimeout函数时.想起曾经刚学时,在一本书上看过setTimeout()里的回调函数执行的间隔时间有昌不是后面设置的值.曾经没想太多.网上看了JS大神的解释,整理记录下JavaScript引擎的内部执行机制. 首先看一段小程序: <script> alert('第1'); setTimeout(function(){alert('第2');}, 2000); alert('第3'); </script> 输出顺序是:第1.第3,第

dubbo_远程同步调用原理

Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况. Dubbo缺省协议,使用基于mina1.1.7+hessian3.2.1的tbremoting交互. 连接个数:单连接 连接方式:长连接 传输协议:TCP 传输方式:NIO异步传输 序列化:Hessian二进制序列化 适用范围:传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要用dubbo协议传输大文件或超大字符串