异步调用的理解

异步调用的理解1.分清异步/同步,阻塞/非阻塞。首先讲下个人对异步和同步,阻塞和非阻塞的概念的理解。关于这个概念看了许多解释,都是似是而非,并不能完全get到点。个人认为从进程间通信的角度理解比较好,在《操作系统》中关于的部分是这样解释的:进程间的通信时通过send()和receive()两种基本操作完成的。具体如何实现这两种基础操作,存在着不同的设计。 消息的传递有可能是阻塞的或非阻塞的…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

1.分清异步/同步,阻塞/非阻塞。

首先讲下个人对异步和同步,阻塞和非阻塞的概念的理解。

关于这个概念看了许多解释,都是似是而非,并不能完全get到点。个人认为从进程间通信的角度理解比较好,在《操作系统》中关于的部分是这样解释的:

进程间的通信时通过 send() 和 receive() 两种基本操作完成的。具体如何实现这两种基础操作,存在着不同的设计。 
消息的传递有可能是阻塞的或非阻塞的 – 也被称为同步或异步的:

  • 阻塞式发送(blocking send). 发送方进程会被一直阻塞, 直到消息被接受方进程收到。
  • 非阻塞式发送(nonblocking send)。 发送方进程调用 send() 后, 立即就可以其他操作。
  • 阻塞式接收(blocking receive) 接收方调用 receive() 后一直阻塞, 直到消息到达可用。
  • 非阻塞式接受(nonblocking receive) 接收方调用 receive() 函数后, 要么得到一个有效的结果, 要么得到一个空值, 即不会被阻塞。

上述不同类型的发送方式和不同类型的接收方式,可以自由组合。也就是说,阻塞和非阻塞可以理解为是发送方的行为,同步和异步是接收方的行为。举个例子:

我们现在去在一条步行街上的银行办理业务,根据场景可以解释为以下多种情况:

拿到号后,自己是一直在等候区等待(阻塞),还是出去逛街,时不时回来确认一下(非阻塞)。

轮到我们办理业务的时候,是我们自己确认轮到自己了(同步),还是银行会通知我们去办理业务(异步)。

 

2.异步调用的原理

如果我们使用一个异步调用方法的时候,可以理解为,发送完请求后,我们就可以继续去做自己的事情,然后在一个合适的节点去取数据即可。这里需要明确,是谁帮我们把这些事情做完的。一般,有两种情况:

第一种情况,本地IO操作时,可以通过DMA功能实现,在调用DMA传输数据的时候,CPU是不需要执行处理的,只需要发起传输和等待传输即可,也就是说,在这段时间里,CPU可以干点别的事情。DMA的英文拼写是“Direct Memory Access”,汉语的意思就是直接内存访问。DMA既可以指内存和外设直接存取数据这种内存访问的计算机技术,又可以指实现该技术的硬件模块(对于通用计算机PC而言,DMA控制逻辑由CPU和DMA控制接口逻辑芯片共同组成,嵌入式系统的DMA控制器内建在处理器芯片内部,一般称为DMA控制器,DMAC)。

第二种情况,通过多线程实现,主线程发起请求操作(这里用线程解释,多进程也是可以的),系统选取一个线程接过这个主线程的请求任务,然后当异步调用晚餐后,系统会从可用线程中选取一个线程执行回调函数,将结果推回给主线程。这里的异步调用,主要是为了让调用方法的主线程不需要同步等待在这个函数调用上,从而可以让主线程继续执行它下面的代码。

关于第二种情况,实现的核心思路在于:

1.其他线程/进程执行IO操作,让发起请求方可以不用等待。

2.在执行完异步调用后,通知调用者提取相关数据(这里可以使用注册回调函数的办法)。

 

3.RPC中的异步调用

RPC框架中,异步请求是一个很重要的方法。一般,在RPC框架中,如果我们使用同步调用,在发起请求后,只能等待结果,中间不能去干其他的事情。我们也称这种模式为请求-响应模式。这个模式优点在于时序清晰,逻辑简单,缺点也显而易见,大量的CPU时间会阻塞在等待请求的响应上,另外,也会存在只能由客户端向服务端发送请求,而服务端无法主动向客户端发送事件通知,也就是缺乏callback机制。

在RPC框架中,一个比较通用的异步调用方法,是在双向会话式的基础上,让调用方通过注册回调函数来获得请求结果实现。双向会话式通讯机制通过去掉请求的返回值,所有的方法请求都定义为无返回结果,调用方在发出请求之后就可以继续干后面的事情了,而不需要再等待服务返回结果。同时针对服务接口定义一个Callback接口用于服务端向客户端发送请求结果和事件通知,通过回调函数,服务器就可以主动向客户端发送消息,将消息推回给请求方。

以上,就是对异步调用的个人理解过程,从基本概念到如何实现。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/157651.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ShellExecute, WinExec, CreateProcess区别

    ShellExecute, WinExec, CreateProcess区别ShellExecute  ShellExecute的功能是运行一个外部程序(或者是打开一个已注册的文件、打开一个目录、打印一个文件等等),并对外部程序有一定的控制。  有几个API函数都可以实现这些功能,但是在大多数情况下ShellExecute是更多的被使用的,同时它并不是太复杂。  ShellExecute函数原型及参数含义如下:  ShellExecute(  HWNDhwnd,…

    2022年7月27日
    4
  • python构造方法的作用_python中类的作用

    python构造方法的作用_python中类的作用1.构造函数的作用构造函数主要用来在创建对象时完成对对象属性的一些初始化等操作,当创建对象时,对象会自动调用它的构造函数。一般来说,构造函数有以下三个方面的作用:■给创建的对象建立一个标识符;■为对象数据成员开辟内存空间;■完成对象数据成员的初始化。2.默认构造函数当用户没有显式的去定义构造函数时,编译器会为类生成一个默认的构造函数,称为”默认构造函数”,默认构造函数不能完成…

    2025年10月9日
    4
  • mac pycharm安装设置_python爬虫 | mac系统PyCharm的安装「建议收藏」

    mac pycharm安装设置_python爬虫 | mac系统PyCharm的安装「建议收藏」视频在之前我们是不是提到了,后面我们要学一个集成的开发环境,就是IDE。全称IntegratedDevelopmentEnvironment,翻译过来集成开发环境。我们经常用PyCharm作为Python开发的IDE,我们以后所有的代码当中可能就要用这个工具去写了。下载我们直接在百度输入,https://www.jetbrains.com/pycharm,进入pycharm安装界面…

    2022年8月26日
    6
  • 2022年双非上岸北京理工大学软件工程经验

    2022年双非上岸北京理工大学软件工程经验感想很久之前就想写一篇文章来记录自己这段考研的辛苦历程了,感谢这一路陪伴我的朋友对我的鼓励支持,软工今年是前30去校本部,后35名去唐山研究院,软工相比于前几年来说一直在缩招,20年招95个,21年招74个,今年招65个,所以23今年想报的要做好会缩招的准备,我最终是去了唐山研究院,但是这对我本科双非的学生来说已经知足了。今年2022年被称为考研元年,难度可以说是极其高了,想要上岸不容易,从如今考研的形式来看,未来考研将会越来越难,希望学弟学妹们仔细认真的选择院校,可以通过关注一些公众号像王道论坛,

    2022年6月14日
    497
  • matlab 时频分析(短时傅里叶变换、STFT)「建议收藏」

    matlab 时频分析(短时傅里叶变换、STFT)「建议收藏」短时傅里叶变换,short-timefouriertransformation,有时也叫加窗傅里叶变换,时间窗口使得信号只在某一小区间内有效,这就避免了传统的傅里叶变换在时频局部表达能力上的不足,

    2022年8月2日
    17
  • 卷积神经网络卷积层和池化层的作用(卷积神经网络的重要性)

    链接:https://www.zhihu.com/question/36686900/answer/130890492个人觉得主要是两个作用:1.invariance(不变性),这种不变性包括translation(平移),rotation(旋转),scale(尺度)2.保留主要的特征同时减少参数(降维,效果类似PCA)和计算量,防止过拟合,提高模型泛化能力(1

    2022年4月12日
    44

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号