异步调用的理解

异步调用的理解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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • FFplay硬件加速[通俗易懂]

    FFplay硬件加速[通俗易懂]本文以ffmpeg-4.4源码为准,a.mp4下载链接:百度网盘,提取码:nl0s。FFplay硬件解码命令如下:ffplay.exe-vcodech264_cuvid-ia.mp4上面命令指定了NVIDIA的硬件解码器,h264_cuvid。在ffplay.c的代码里面硬件解码跟普通解码在逻辑上没有做什么特殊的处理。ffplay.c里面没有像ffmpeg.c那样支持-hwaccel这个选项,所以ffplay.c的硬件解码流程跟普通解码…

    2022年6月25日
  • vi/vim常用命令

    vi/vim常用命令ctrl+b上一页ctrl+f下一页ctrl+u上半页ctrl+d下半页H跳到屏幕的第一行M跳到屏幕的中间行L跳到屏幕的最后一行zt将光标所在的那一行移至屏幕顶部zb将光…

    2022年5月22日
  • linux telnet命令怎么算端口通,telnet命令怎么看端口通不通

    linux telnet命令怎么算端口通,telnet命令怎么看端口通不通下面是telnet命令怎么看端口通不通:1.同时按下键盘快捷键win+r,打开运行界面,输入cmd,回车确定。2.在命令提示符界面输入“telnet+空格+ip”确定就可查询端口是否连通。如何看端口通不通,情况下面的提示:如果端口关闭或无法连接,则表明无法打开与主机的链接,并且链接失败;如果端口打开,则链接成功,然后进入telnet页面(全黑)以证明该端口可用。Telnet客户端命常用命令:op…

    2022年11月1日
  • 什么是CPU密集型、IO密集型?「建议收藏」

    什么是CPU密集型、IO密集型?「建议收藏」CPU密集型(CPU-bound)CPU密集型也叫计算密集型,指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPULoading100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPULoading很高。在多重程序系统中,大部份时间用来做计算、逻辑判断等CPU动作的程序称之CPUbound。例如一个计……

    2022年9月13日
  • SpringBoot安全线程锁工具类[通俗易懂]

    SpringBoot安全线程锁工具类[通俗易懂]这几日对接物联网项目,前端请求数据,后端接口发起TCP请求,由另一个线程来接收数据,这时候需要阻塞前端发起的请求,直到TCP接收数据完毕,再返回数据给前端。特此写了一个工具类importjava.util.concurrent.ConcurrentHashMap;importjava.util.concurrent.locks.LockSupport;publicclassLockSupportUtil{//存放线程引用的全局容器publicstaticfina

    2022年6月16日
  • PyCharm安装torch等

    PyCharm安装torch等pipinstalltorchpipinstalltorchvi

    2022年8月27日

发表回复

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

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