异步调用的理解

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


相关推荐

  • 特殊符号大全复制_特殊符号大全爱好者工具讲解[通俗易懂]

    特殊符号大全复制_特殊符号大全爱好者工具讲解[通俗易懂]前言:明天将会举办第2期微信昵称悬赏令,第1期结果已公布,如果您还没准备好,可以先准备一下哦。下面是第1期的结果放榜-微悬令第1期活动结束,奖金会陆续发放给获奖同学!漂亮的网名昵称符号让我们在游戏或者其它平台里面显得与众不同,为了实现这样的目标,小编制作了网名在线生成器,这是一整套的工具,可以让我们快速定制出与众不同的符号特殊符号大全爱好者首先我们打开昵称符号加字器,这是个非常有用的网名…

    2022年6月11日
    95
  • hash冲突以及hash冲突的解决方法

    hash冲突以及hash冲突的解决方法首先说一下hash冲突吧,hash冲突在hash表中一般情况下是会遇到的;hash冲突指的是你在向hash表中存数据时,首先要通过key值进行指定的hash算法进行计算,然后得到一个值,这个值就是你要将这个key对应的value存入的地址。但是在这个地址中已经有值存在,所以这个时候就发生了hash冲突,不同的key通过hash算法得到了对应的同一个值。hash冲突解决的方法:再hash法:这种方法就是有多个hash算法,当使用一个hash算法计算得到值发生hash冲突时那就使用另外一个hash算法

    2022年10月8日
    2
  • Vue项目关于eslint

    Vue项目关于eslint  新公司的Vue项目没有配置eslint,虽然平时coding的时候都会按照eslint的标准去写,但是没有统一的配置后期项目代码review的时候总还是不太方便。  Vue的项目配置eslint还是很简单的。它属于依赖插件中的一种,可以像安装其他插件一样在命令行用npminstalleslint-g安装,也可以修改package.json文件去更新项目的依赖包,重新跑一遍npm…

    2022年6月18日
    28
  • webstorm整理代码格式快捷键_电脑上的快捷键有哪些

    webstorm整理代码格式快捷键_电脑上的快捷键有哪些centOS下webstorm格式化代码的快捷键Ctrl+Shift+lwindows下webstorm格式化代码的快键键Ctrl+Alt+lmac下webstorm格式化代码的快捷键Option+Command+l

    2022年5月3日
    78
  • HDFS命令_hadoop集群命令

    HDFS命令_hadoop集群命令hdfs常用命令:第一部分:hdfs文件系统命令第一类:文件路径增删改查系列:hdfsdfs-mkdirdir创建文件夹hdfsdfs-rmrdir删除文件夹dirhdfsdfs-ls查看目录文件信息hdfsdfs-lsr递归查看文件目录信息hdfsdfs-statpath返回指定路径的信息第二类:空间大小查看系列命令:hdfsdfs-du-hdir按照适合阅读的形式人性化显示文件大小hdfsdfs-dusuri递归显示目标

    2022年10月5日
    1
  • Yii Framework2.0开发教程(2)使用表单Form

    Yii Framework2.0开发教程(2)使用表单Form

    2022年1月26日
    36

发表回复

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

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