ZeroC ICE的远程调用框架 AMI与AMD -Why?
在Ice有两种异步使用的方式,AMI和AMD。AMI是异步方法调用,AMD是异步方法调度(分派)。前者用在代理端,后者用在饲服实现端。
AMI其实就是在代理端,使用Future机制进行异步调用,而不阻塞等待响应结果。
AMD只是提供一种回调机制,让你可以选择返回响应的时机,不必在Skeleton调度(分派)你的方法调用最后返回响应,这样你可以制造一个barrier让一组响应同时返回。或者在你的方法实现中要依赖代理远程调用时,组合这个代理AMI方式,让你的响应操作在AMI完成事件回调处执行,这点是在饲服实现端进行AMI代理调用的必要前提。AMD方式让你的调用分派是否并发没有关系,因为是对象适配器使用线程池在并发分派你的调用。
我们先来看看一次Ice远程调用在不使用异步方式编程的活动流
在ActiveObject模式下,调用和调用调度执行分别在两条不同的控制流中进行。并且在调用执行之外的增加了不少开销,其中调用红色的活动是可能发生长时间等待,或消耗长时间处理,发而阻塞住活动所在的控制流。在调用方的控制流可能因为等待响应结果而阻塞,而远端调用调度执行的控制流也可能因为调用执行本身会等待事件或进行长时间任务而阻塞。所在不论在调用方的控制流抑或远端调用调度执行的控制流都需要应用异步编程的方法来避免阻塞。在调用方控制流使用异步编程的方法叫做AMI,远端调用调度执行的控制流使用异步编程的方法叫做AMD。一般地异步编程方法将一个任务分开两部分,分别在不同的控制流中执行,任务调度给别的控制流后将转入其它任务的执行上下文。
由于等待事件而阻塞控制流,则将等待事件和后续任务调度给其它控制流,然后离开当前任务的控制流。
由于任务中包含了长时间的子任务,则将长时间的子任务调度给别的控制流,然后离开当前任务的控制流。
因为在调用方(即使用代理方)的控制流上同步等待响应结果的话,就可能需要长时间阻塞当前控制流,所以在调用方等待响应结果的任务使用回调调度到其它控制流的编程方法就是AMI(Asynchronous Method Invoke)。
而在远端调用调度执行方,为了不阻塞调度(Dispatch)的控制流,使用异步编程方法就是AMD(Asynchronous Method Dispatch)。由于远端调用执行在调度的控制流上,至使因为一个长时间执行或需要等待的调用会阻塞调度控制流,从而不能调度其它请求的调用,降低调度请求的吞吐。将调用的响应任务做成可回调,就可以使调用执行从调度控制流中分离出来,不至阻塞住调度控制流。这就是AMD相关的框架设施为我们提供的服务。
下面是使用AMD方式的三种情况:
长时间执行的调用从调度流分离
在调用执行中依赖其它远程调用,要使用AMI,就必须依赖AMD,即在Servant端组合AMI到AMD使用。换句话说,当你看到一个接口的方法声明为["amd"]时,可能意味着这个方法的执行中依赖另外的代理(远程调用)。
第三种是用AMD来同步(Sync Barrier)响应输出。Barrier绝对不能做在调度控制流上,所以Barrier依赖AMD。有这么一种情况,调用在调度控制流的线程池中并发执行,响应的次序不能确保,而你需要确保响应有序,那么就必须设立一个Barrier,然后在Barrier处将响应重建次序。
ZeroC ICE的远程调用框架 AMI与AMD -Why?的更多相关文章
- ZeroC ICE的远程调用框架 Slice如何帮助我们进行Ice异步编程(AMI,AMD)
Slice最大的用处就是为我们使用Ice进行编程,代劳绝大部分的重复性代码,并提供一些帮助性的框架代码,如用于AMI和AMD方式进行异步编程的回调框架. 当Slice不为我们生成代码时,我们仍然可以按 ...
- ZeroC ICE的远程调用框架 AMD
继上一篇<ZeroC ICE的远程调用框架>,本篇再来说其中的AMD.(本篇需要重写) 当在ice文件中声明某个接口方法Method为["amd"]后,接口方法在stu ...
- ZeroC ICE的远程调用框架
想搞清楚slice为我们生成了什么样的框架代码,就先搞明白Ice的远程调用框架暗中为我们做了些什么? Ice将Ice Object的方法调用分为三个阶段(或步骤),分别是begin,process和e ...
- ZeroC ICE的远程调用框架 Callback(一)-AMI异步方法调用框架
Ice框架提供了不少回调设施,其中一些是使用Ice远程调用进行ami模式或amd模式的支撑.本篇来看一下用于代理端的回调设施. Ice代码中有好几个Callback相关命名的基类,并且slice还会为 ...
- ZeroC ICE的远程调用框架 class与interface
我们在ice文件中定义的class或interface,slice都会为我们生成stub存根类和skeleton骨架类.在这里要注意slice并没有分别生成两份单独用在客户端或服务端的接口给开发分发. ...
- ZeroC ICE的远程调用框架 ServantLocator与Locator
ServantLocator定位的目标是Servant,而Locator定位的目标是“Ice Object”,即一个可定位的“Ice Object”代理.Servant是::Ice::Object的继 ...
- ZeroC ICE的远程调用框架 ThreadPool
ThreadPool提供Reactor/Proactor服务,并且强偶合了Reactor(反应器)/Proactor(前摄器).不同于Reactor/Proactor使用线程池 进行事件处理的设计.如 ...
- ZeroC ICE的远程调用框架 代理引用地址
在官方文档中称为Binding,协议-地址对的绑定.在Proxy模式中,一般地有三个参与者,Proxy,Subject以及RealSubject.Subject定义了Proxy(代理)和RealSub ...
- ZeroC ICE的远程调用框架 ASM与defaultServant,ServantLocator
ASM与defaultServant,ServantLocator都是与调用调度(Dispatch)相关的. ASM是ServantManager中的一张二维表_servantMapMap,默认Ser ...
随机推荐
- vue-cli 3.x 自定义插件并发布到 npm
干货转载——https://www.cnblogs.com/wisewrong/archive/2018/12/28/10186611.html 全是知识点呐 赶紧记下来啊 一.调整项目结构 首先用 ...
- mac外接显示器 字体发虚解决方案
描述 今天买的LG性价比之王21:9的2k显示器到了,但是连接mbp后发现,字体发虚,模糊 Macbook 外接显示器默认为 TV 模式,TV 渲染模式下,文字效果非常非常非常差 解决 下载 patc ...
- Mybaits 源码解析 (三)----- Mapper接口底层原理(为什么Mapper不用写实现类就能访问到数据库?)
上一篇我们讲解到mapperElement方法用来解析mapper,我们这篇文章具体来看看mapper.xml的解析过程 mappers配置方式 mappers 标签下有许多 mapper 标签,每一 ...
- day1-02 python程序语法分析
一.概述 程序的格式框架 命名与保留字 数据类型 语句与函数 Python程序的输入输出 二.程序的格式框架 # TempConvert.py # 输入温度 TempStr = input(" ...
- Dom对象更改文档结构.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- jquery获取dom属性方法
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 使用msfvenom生成木马
msfvenom Options: -p, --payload < payload> 指定需要使用的payload(攻击荷载).如果需要使用自定义的payload,请使用& #03 ...
- 《Effective Java》 读书笔记(五)使用依赖注入取代原本的资源依赖
相信接触过Spring的同学,对于依赖注入并不陌生. 刚开始在听说这个名字的时候,一直不明白到底什么叫依赖注入,后来才发现,依赖注入一直都存在我们日常代码中,只是我们没有刻意的把它提出来,然后再取这样 ...
- [考试反思]1108csp-s模拟测试105: 傀儡
评测机是真的老了... 我的脑力也老了... 昨天写完T3之后感觉脑子就留在那了,直到现在还感觉自己神志不清... T1OJ上过了(跑得挺慢但是的确过了),但是文件评测同样是开O2居然只剩下70分.. ...
- [考试反思]0825NOIP模拟测试31:喘息
好吧,我又活了 大脸又. 240,220,210,200,200... T1是个不会证明的傻子找规律算上看了一遍三道题之后一共20分钟搞定. skyh打的是错的可是成功qj全部测试点得到AC(会被手模 ...