怎样理解阻塞异步和非阻塞的区别与同步异步的区别

深入讨论阻塞与非阻塞、同步与异步的区别 - 简书
下载简书移动应用
写了59768字,被439人关注,获得了249个喜欢
深入讨论阻塞与非阻塞、同步与异步的区别
一、概念异步:某个事情需要10s完成。而我只需要调用某个函数告诉xxx来帮我做(然后我再干其他的事情)同步:某个事情需要10s完成,我需要一直等它完成(等10s),再能继续后面的工作。阻塞:做某件事情,直到完成,除非超时非阻塞:尝试做,如果不能做,就不做(直接返回),如果能做,就做。前两者和后两者不容易区分,不过前两者更多的有涉及到多线程交互(消息)的场景。二、举个例子小李喝了想喝水,于是去煮开水。1、小李把水壶放到炉子上,等待水烧开。(同步阻塞)小李感觉这样太费时间。2、小李把水壶放到炉子上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞)小李还是觉得自己这样太累,于是买了把会响笛的那种水壶。水开之后,能发出声音。3、小李把响水壶放到炉子上,等待水壶发出声音。(异步阻塞)觉得这样傻等意义不大5、小李把响水壶放到炉子上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞)这样真好。三、深入理解阻塞就是 recv/read的时候 socket接收缓冲区要是有数据就读, 没数据我就一直睡觉赖着不走,直到有数据来了读完我才走。send/write的时候,要是发送缓冲区满了,没有空间继续发送了我也一直睡觉赖着不走,直到发送缓冲区腾出足够的空间让我把数据全部塞到发送缓冲区里我才走。(当然如果你通过setsockopt设置了读写超时,超时时间到了还是会返回-1和EAGAIN,不再睡觉等待)非阻塞就是recv/read的时候,要是接收缓冲区有数据我就读完,没有数据我直接带着返回的-1和EGAIN走人,绝不睡觉等待耽误时间。write/send的时候, 要是发送缓冲区有足够的空间,就立刻把数据塞到发送缓冲区去,然后走人,如果发送缓存区满了,空间不足,那直接带着返回的-1和EAGAIN走人。至于IO多路复用,首先要理解的是,操作系统为你提供了一个功能,当你的某个socket接收缓存区有数据可读,或者发送缓冲区有空间可写的时候,它可以给你一个通知。这样当配合非阻塞的socket使用时,只有当系统通知我哪个描述符可读了,我才去执行read操作,可以保证每次read都能读到有效数据而不做纯返回-1和EAGAIN的无用功。写操作类似。操作系统的这个功能通过select/poll/epoll之类的系统调用函数来使用,这些函数都可以同时监视多个描述符的读写就绪状况,这样,多个描述符的I/O操作都能在一个线程内完成,这就叫I/O多路复用,这里的“复用”指的是复用同一个线程。至于事件驱动,其实是I/O多路复用的一个另外的称呼。
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
被以下专题收入,发现更多相似内容:
@IT 专题 由 IT大分类,转定位于IT·互联网行业观察与思考,数码产品极客体验。
主编:向右奔跑 http://www.ji...
· 113498人关注
专注IT技术探索、分析与科普。
· 1453人关注
Think Different
编程的思想、智慧和艺术
· 52人关注
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:用一个比喻来解释对
同步 异步 阻塞 非阻塞 轮询 回调 的理解
大二时看《Thinking in java》里NIO时这几个概念就很含混,现在大四快毕业了,看《tomcat权威指南》时又得遇到这些概念,这次决定弄懂它。
如果直接从网上扒它们的定义,那我写这个博客就啥意义都没有了,还不如写一堆链接呢!而且用专门的定义解释对于很多人而言就是用术语解释术语,那他们就得继续谷歌不懂的名词了。所以我觉得还是用孟子的思想:用鱼和熊掌比喻一下生和义吧
打个比方,我在网上买了个东西,然后就等东西送到邮局去取了。就有这4种情况:
你立刻傻站在邮局门口等东西来
你继续做你要做的事,不会因为会有包裹影响正常生活该做的
东西邮到给你发短信
东西邮到没人吭声通知你
就是阻塞啦(因为会有包裹,你就专门等包裹来,包裹不到你就在邮局门口罢工!绝食!),
就是非阻塞啦(不会因为有包裹你就影响你正常生活和该做的工作)
就是异步啦(人家很敬业的通知你)
就是同步啦(暴走大世界里黑ems邮件堆成山却不通知人取就是这种情况啦)
然后排列组合,又有了这四种情况:
1.同步阻塞:包裹来了不通知你,你就傻站在邮局门口等包裹来了
2.同步非阻塞(轮询):你该干啥干啥,虽然人家不通知你,但你时不时的跑去邮局问问我包裹到了没.至于你是每天中午问呢还是每隔一小时就跑去问一次,那就看你有多能墨迹了
3.异步阻塞:虽然伦家会短信通知你,但你偏要在邮局门口傻站着等包裹到.有时间,就是这么任性!但我估计程序猿应该没谁会写出这么任性的代码吧?
4.异步非阻塞(回调):其实第一次听说要在邮局外面等邮件我是拒绝的,因为,你不能让我搁下所有工作,我就马上去邮局外面等邮件……等了一阵时间,手机,DUANG~~DUANG~~DUANG~~我的邮件到邮局里了
总之,异步都是用在非阻塞上,因为我还没见过谁写异步阻塞的程序,如果你狠任性,那就试着写个异步阻塞的程序感受一下吧!
其实我闲扯淡就是为了加深对这些术语概念的理解,可能解释的有漏洞,还望诸大神指正
& 开源中国(OSChina.NET) |
开源中国社区(OSChina.net)是工信部
指定的官方社区IO模型-- 同步和阻塞,异步和非阻塞的区别
IO模型-- 同步和阻塞,异步和非阻塞的区别
这些词之间的区别难倒了很多人,还有什么同步阻塞, 同步非阻塞, 异步阻塞, 异步非阻塞,乱七八糟的。很多文章也想讲明白这个问题。著名且引起热议的有/developerworks/cn/linux/l-async/可是看了之后还是有点将信将疑,跑到图书馆翻了UNP 第一卷,不愧是圣经级别的著作,似有所悟。UNP所述:POSIX定义中,同步IO操作:IO操作将导致请求进程阻塞,直到IO操作完成。异步IO操作:IO操作不导致请求进程阻塞UNP中总结的IO模型有5种之多阻塞IO,非阻塞IO,IO复用,信号驱动IO,异步IO,前四种都属于同步IO。阻塞IO不必说了非阻塞IO ,IO请求时加上O_NONBLOCK一类的标志位,立刻返回,IO没有就绪会返回错误,需要请求进程主动轮询不断发IO请求直到返回正确IO复用同非阻塞IO本质一样,不过利用了新的select系统调用,由内核来负责本来是请求进程该做的轮询操作。看似比非阻塞IO还多了一个系统调用开销,不过因为可以支持多路IO,才算提高了效率信号驱动IO,调用sigaltion系统调用,当内核中IO数据就绪时以SIGIO信号通知请求进程,请求进程再把数据从内核读入到用户空间,这一步是阻塞的。异步IO,如定义所说,不会因为IO操作阻塞,IO操作全部完成才通知请求进程。这样以来,同步和阻塞,异步和非阻塞就不会被混淆了,它们不是同一个方面上的概念,不能比较区别同步和异步是只跟IO操作过程中进程的状态变化有关阻塞和非阻塞就是进程的两种状态。
发表评论:
馆藏&21473
TA的推荐TA的最新馆藏[转]&[转]&怎样理解阻塞非阻塞与同步异步的区别?
发现很多人对这两个概念往往混为一谈
按时间排序
一个异步的过程可以通过阻塞线程(执行绪)来进行同步调用。
额 这么复杂…… 我一直理解异步同步是描述接口的,阻塞不阻塞式描述调用者的……
阻不阻塞和同步异步有什么关系
还是不同层次的问题……一个网络包从应用程序A发到另一台电脑上的应用程序B,需要经历:从A的业务代码到A的软件框架从A的软件框架到计算机的操作系统内核从A所在计算机的内核到网卡从网卡经过网线发到交换机等设备,层层转发,到达B所在计算机的网卡从B所在计算机的网卡到B所在计算机的内核从B所在计算机的内核到B的程序的用户空间从B的软件框架到B的业务代码这个层级关系就像是过程调用一样,前一级调用后一级的功能,后一级返回一个结果给前一级(比如:成功,或者失败)。只有在单独一级的调用上,可以说同步还是异步的问题。所谓同步,是指调用协议中结果在调用完成时返回,这样调用的过程中参与双方都处于一个状态同步的过程。而异步,是指调用方发出请求就立即返回,请求甚至可能还没到达接收方,比如说放到了某个缓冲区中,等待对方取走或者第三方转交;而结果,则通过接收方主动推送,或调用方轮询来得到。从这个定义中,我们看,首先1和7,这取决于软件框架的设计,如果软件框架可以beginXXX,然后立即返回,这就是一种异步调用,再比如javascript当中的异步HTTP调用,传入参数时提供一个回调函数,回调函数在完成时调用,再比如协程模型,调用接口后马上切换到其他协程继续执行,在完成时由框架切换回到协程中,这都是典型的异步接口设计。而2和6,其他答主已经说得很好了,其实都需要调用方自己把数据在内核和用户空间里搬来搬去,其实都是同步接口,除非是IOCP这样的专门的异步传输接口,所以这一级其实是同步的,阻塞与非阻塞的区别其实是影响调用接口的结果(在特定条件下是否提前返回结果),而不是调用方式。3和5,内核一般通过缓冲区,使用DMI来传输数据,所以这一步又是异步的。4,以太网是个同步时序逻辑,随信号传输时钟,必须两边设备同时就绪了才能开始传输数据,这又是同步的。总结来说,讨论究竟是异步还是同步,一定要严格说明说的是哪一部分。其他答主说非阻塞是同步而不是异步,这毫无疑问是正确的,然而说某个框架是异步IO的框架,这也是正确的,因为说的其实是框架提供给业务代码的接口是异步的,不管是回调还是协程,比如说我们可以说某个库是异步的HTTPClient,并没有什么问题,因为说的是给业务代码的接口。由于通常异步的框架都需要在2中使用非阻塞的接口,的确会有很多人把非阻塞和异步混为一谈。
同步异步是一个概念阻塞非阻塞是一个概念同步发出请求后必须返回,否则后续任务不会执行。立即返回(返回成功,空,错啊什么的,可以不断轮询查问进度)就是不阻塞,不是的话就阻塞异步发出请求后可以接着执行后续任务,不用等待返回。可以用多线程,定时器实现。Java NIO可以参考这篇文章:
(A)同步和异步,是针对 调用结果是如何返回给调用者来说的,即调用的结果是调用者主动去获取的(比如一直等待recvfrom或者设置超时等待select),则为同步,而调用结果是被调用者在完成之后通知调用者的,则为异步(比如windows的IOCP)。(B)阻塞和非阻塞,是针对调用者所在线程是否在调用之后主动挂起来说的,即如果在线程中调用者发出调用之后,再被调用这返回之前,该线程主动挂起,则为阻塞,若线程不主动挂起,而继续向下执行,则为非阻塞。这样,在网络IO中,同步异步,阻塞非阻塞,就可以形成2x2 = 4种情况,(1)同步阻塞: 调用者发出某调用之后(比如调用了read函数),如果函数不能立即返回,则挂起所在线程,等待结果;(2)同步非阻塞:调用者发出调用之后(比如read),如果当时有数据可读,则读取并返回,如果没有数据可读,则线程继续向下执行。在实际使用时,read调用会在一个循环中,这样就可以不断的读取数据(尽管可能某次read操作并不能获得任何数据);(3)异步阻塞:调用者发出调用之后(如async_recv),线程挂起,被调用的读操作由系统(或者库)来进行,等待有结果之后,系统(或者库)通过某种机制来通知调用者(在调用者获得结果之前,调用者所在线程一直阻塞,这个看起来和同步阻塞很像,但可以这样理解,同步阻塞相当于调用者A调用了一个函数F,F是在调用者A所在的线程中完成的,而异步阻塞相当于调用者A发出对F的调用,然后A所在线程挂起,而实际F是在另一个线程中完成,然后另一个线程通知给A所在的线程,更准确的是将两个线程分别换成用户进程和内核);(4)异步非阻塞:调用者发出调用之后(如async_recv),线程继续进行别的操作,被调用的读操作由系统(或者库)来进行,等待有结果之后,系统(或者库)通过某种机制(一般为调用调用者设置的回调函数)来通知调用者。
没有代码例子,看了还是不太明白
异步是编程语言和调用的API协同模拟出来的一种程序控制流风格,编程语言和API不支持的话,无法使用这种风格。这里的关键点是这可以和OS无关:OS即使没有异步系统调用,编程语言也可以模拟一个出来;即使OS有异步系统调用,编程语言也可以屏蔽这个能力非阻塞系统调用是个“伪概念”。天底下没有非阻塞的系统调用。只有返回特别快的阻塞系统调用和返回时间不确定的阻塞系统调用
异步/同步、阻塞/非阻塞,两组概念不是一个层面上的,关注点不一样。阻塞就是一个事情A被某件事情X阻碍了,不能继续往下干任何事了,需要等待;非阻塞就是A不会因为X的发生而导致等待,因而可以继续干后面的事情。仅仅站在A的角度,是否会因为某件事情X而导致等待。同步就是两个事情A、B通过一种机制进行步调协同,而异步是A和B各干各的互不相扰。这组概念关注的是A和B之间的协同关系,是否需要通过某种机制进行步调协同,并不关注A、B是否需要等待。典型的如线程同步锁机制。
同步调用中,被调用者会被阻塞。
1.你去胡大吃小龙虾,去了之后要排队,你在那站着傻等(同步阻塞)2.你觉得傻等不是个事情,就去簋街溜达一圈回来再看看,这期间你不间断地打电话问老板排到你没有。(同步非阻塞)3.现在科技先进了,可以扫描二维码排队了,你去了之后扫描二维码之后就去逛街了,等排到你的时候手机会通知你来吃饭。(异步阻塞)4.现在科技更先进了,去了扫描二维码,可以自助下单,然后就可以去逛街了,当你轮到你的时候会给你发出通知,并且你的小龙虾已经做好了(异步非阻塞)排队是同步 异步吃小龙虾是阻塞非阻塞
这几个概念,上面不少答案已经写得很清楚了。这里我结合自己的理解,简单地聊一下为什么这几个概念容易混淆。如果有错误之处,恳请批评指正。我认为同步、异步、阻塞、非阻塞,是分3个层次的:CPU层次;线程层次;程序员感知层次。这几个概念之所以容易混淆,是因为没有分清楚是在哪个层次进行讨论。CPU层次在CPU层次,或者说操作系统进行IO和任务调度的层次,现代操作系统通常使用异步非阻塞方式进行IO(有少部分IO可能会使用同步非阻塞轮询),即发出IO请求之后,并不等待IO操作完成,而是继续执行下面的指令(非阻塞),IO操作和CPU指令互不干扰(异步),最后通过中断的方式来通知IO操作完成结果。线程层次在线程层次,或者说操作系统调度单元的层次,操作系统为了减轻程序员的思考负担,将底层的异步非阻塞的IO方式进行封装,把相关系统调用(如read,write等)以同步的方式展现出来。然而,同步阻塞的IO会使线程挂起,同步非阻塞的IO会消耗CPU资源在轮询上。为了解决这一问题,就有3种思路:多线程(同步阻塞);IO多路复用(select,poll,epoll)(同步非阻塞,严格地来讲,是把阻塞点改变了位置);直接暴露出异步的IO接口,如kernel-aio和IOCP(异步非阻塞)。程序员感知层次在Linux中,上面提到的第2种思路用得比较广泛,也是比较理想的解决方案。然而,直接使用select之类的接口,依然比较复杂,所以各种库和框架百花齐放,都试图对IO多路复用进行封装。此时,库和框架提供的API又可以选择是以同步的方式还是异步的方式来展现。如python的asyncio库中,就通过协程,提供了同步阻塞式的API;如node.js中,就通过回调函数,提供了异步非阻塞式的API。总结因此,我们在讨论同步、异步、阻塞、非阻塞时,必须先明确是在哪个层次进行讨论。比如node.js,我们可以说她在程序员感知层次提供了异步非阻塞的API,也可以说在Linux下,她在线程层次以同步非阻塞的epoll来实现。
今天看了好多文章,说一下我的理解,欢迎指正。同步和异步的区别是,被调用者是否会通过原调用通知调用者;阻塞和非阻塞的区别是,调用者是否会一直等待被调用者的通知。同步阻塞:A调用了B,然后A什么都不做,一直等待B的返回;B执行完后通过原调用返回。同步非阻塞:A调用了B,然后A执行其他操作后隔段时间看看原调用是否有返回;B执行完后通过原调用返回。异步阻塞:A调用了B,然后A什么也不做,一直等待B的回调;B执行完后通过回调、状态等其他方式通知A结果。异步非阻塞:A调用了B,然后A继续做别的,不再搭理B;B执行完后通过回调、状态等其他方式通知A结果。
POSIX对同步/异步I/O的定义是:同步I/O:导致请求进程阻塞,直到I/O操作完成。异步I/O:不导致请求进程阻塞。根据这个定义,阻塞式I/O、非阻塞式I/O、I/O复用和信号驱动I/O都是同步I/O,因为都会阻塞在将数据从内核空间复制到用户空间阶段。只有异步I/O与POSIX定义的异步I/O匹配。
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。作者:愚抄链接:来源:知乎老张爱喝茶,废话不说,煮开水。出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。1 老张把水壶放到火上,立等水开。(同步阻塞)老张觉得自己有点傻2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞)老张还是觉得自己有点傻,于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀~~~~的噪音。3 老张把响水壶放到火上,立等水开。(异步阻塞)老张觉得这样傻等意义不大4 老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞)老张觉得自己聪明了。所谓同步异步,只是对于水壶而言。普通水壶,同步;响水壶,异步。虽然都能干活,但响水壶可以在自己完工之后,提示老张水开了。这是普通水壶所不能及的。同步只能让调用者去轮询自己(情况2中),造成老张效率的低下。所谓阻塞非阻塞,仅仅对于老张而言。立等的老张,阻塞;看电视的老张,非阻塞。情况1和情况3中老张就是阻塞的,媳妇喊他都不知道。虽然3中响水壶是异步的,可对于立等的老张没有太大的意义。所以一般异步是配合非阻塞使用的,这样才能发挥异步的效用。——来源网络,作者不明。======================================================1. 我还满喜欢用老张这个故事来解释同步、异步、阻塞、非阻塞。Thumb up2. 不喜欢后面把水壶和老张分开说事。3. 让我来还原下,事情的真相:同步:说白了就是老张主动等, 别的不干。主动等有两种:1. 干等,这个时候的老张好像死去一般 == 阻塞。来,上个图:2. 时不时看看水开没有?通过查状态,证明老张还活着 == 非阻塞。继续上图:发现没有,他就真的没有干过其他事情。。。异步:老张换了有响声的水壶,决定等消息来(听响声),其间可以干点别的事情。可是,老张第一次用发声音的水壶烧水,心里没谱,1000个不放心啊,于是他决定,还是:1. 干等。啥都不干的死盯水壶,看看水壶会不会发出声音?
于是老张又一次死去般寂静 == 阻塞。终于水壶响了。2. 于是,老张终于放心地去干别的事情了。等着听水壶响声就行 == 非阻塞。有木有一目了然的感觉。图片出自:
这个问题纠结好长时间;在楼上各位大大的分析上总结了下。异步就是异步同步(synchronous), 异步(asynchronous), 阻塞(blocking) 和 非阻塞(non-blocking). 阻塞和非阻塞
要区分场合范围, 比如 Linux中说的 非阻塞I/O 和 Java的NIO1.0中的 非阻塞I/O 不是相同的概念. 从最根本来说, 阻塞就是进程 "被" 休息, CPU处理其它进程去了. 非阻塞可以理解成: 将大的整片时间的阻塞分成N多的小的阻塞, 所以进程不断地有机会 "被" CPU光顾, 理论上可以做点其它事. 看上去 Linux非阻塞I/O 要比阻塞好, 但CPU会很大机率因socket没数据而空转. 虽然这个进程是爽了, 但是从整个机器的效率来说, 浪费更大了!
Java NIO1.0中的非阻塞I/O中的 Selector.select()函数还是阻塞的, 所以不会有无谓的CPU浪费.
Java NIO1.0, 与其说是非阻塞I/O, 还不如说是, 多路复用I/O。同步和异步关注的是消息通信机制;
同步在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回。但是一旦调用返回,就得到返回值了。
异步在*调用*发出之后,这个调用就直接返回了,所以没有返回结果。
需要关注先后顺序的操作,必须同步;反之异步可以很好的提示效率。阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态;
阻塞调用是指调用结果返回之前,当前线程会被挂起,调用线程只有在得到结果之后才会返回
非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。
阻塞与非阻塞比较容易理解,同步异步的概念推荐《Unix网络编程》中的描述先从IO的两个阶段说起:1. 等待数据就绪2. 数据在内核态和用户态之间的复制异步IO是指在任何一个阶段的IO操作都是非阻塞的,否则就是同步的。当然这只是内核层面同步与异步的定义,编程模型层面的同步和异步也又略有不同,因为语言层面可能做了一些封装模拟出一些异步的调用方式。编程模型层面,异步指的是开发人员只需要关注IO操作完成的通知,而不是IO就绪状态的通知。通俗地讲,就是只需要告诉运行时在IO完成后做什么操作就可以了。
根据自己看到的,想到的,整理下自己的理解,权当交流。IO操作其实可以分成两个步骤,请求IO操作和执行IO操作。一般的IO调用过程是这样的:发起IO操作的请求,执行IO操作,得到IO操作的结果,将结果返回给IO操作请求。同步和异步同步和异步是一种通信机制,涉及到调用方和被调用方,关注的是IO操作的执行过程及结果的返回方式,不同点在于双方在这两个方面的行为方式。如果调用方需要保持等待直到IO操作完成进而通过返回获得结果,则是同步的;如果调用方在IO操作的执行过程中不需要保持等待,而是在操作完成后被动的接受(通过消息或回调)被调用方推送的结果,则是异步的。同步和异步,适合描述执行IO操作的情境。阻塞和非阻塞阻塞和非阻塞是一种调用机制,只涉及到调用方,关注的是IO操作的执行状态,不同点在于请求IO操作后,针对IO操作的状态,调用方的行为方式。如果调用方等待IO操作完成后返回,则是阻塞的;如果调用方不需要等待IO操作完成就立即返回,则是非阻塞的,非阻塞的情况下,常常需要多次调用去check,才能获得IO操作的结果。阻塞和非阻塞,适合描述发起IO操作请求的情境。阻塞与非阻塞,和同步异步无关,可以阻塞等待同步执行过程完成,也可以阻塞等待异步执行过程完成。根据以上理解,同步和异步,阻塞和非阻塞,是可以互相组合的。同步阻塞调用者发起IO操作请求,等待IO操作完成再返回。IO操作的过程需要等待,操作执行完成后返回结果。同步非阻塞调用者发起IO操作请求,询问IO操作的状态,如果未完成,则立即返回;如果完成,则返回结果。IO操作的过程需要等待执行完成才返回结果。异步阻塞调用者发起IO操作请求,等待IO操作完成再返回。IO操作的过程不需要等待,操作完成后通过通知或回调获得结果。异步非阻塞调用者发起IO操作请求,询问IO操作的状态,如果未完成,则立即返回;如果完成,则返回结果。IO操作的过程不需要等待,操作完成后通过通知或回调获得结果。
说实话在代码层面我并没有见过有关阻塞的说法,或者只是将阻塞作为同步这种做法的代价提一下。区分这几者主要还是启发思路,看待操作粒度不同会得到不同的描述。比如异步式的同步:把本来的后续同步操作写到异步的回调函数里。畅所欲言地讲,异步(对应同步)常见于描述【发起行为的进程主体】里某区块代码的操作现在不具备充分的进行条件、应该在什么情况下被执行。而非阻塞概念如果有别的意思(和异步同语反复就没意思了,如无回调的异步操作),那只能想象是指【接收行为的受体(硬件资源、操作系统或常驻程序等,当然本质一样)】允许在上个操作没进行完时接下下个操作。
我觉得楼上打电话和QQ的例子比较方便理解,因为题主讨论的是编程问题。比较打电话和用QQ打字聊天的区别:打电话就是同步,你讲话时对方在听,对方讲话时你在听。通话过程始终是两个人同时参与,不可能你讲话的时候,他在干别的事。QQ则不同,你打字时不关他什么事,他可以停在那里什么也不做,等着你发送信息。他也可以先和别人聊上两句再回来和你聊。这就是异步。干一件事需要双方协作,才有同步异步。如果是一个人自己干的事无所谓同步异步。阻塞与非阻塞是指做事的方式,不是指双方,而是就一方而言:一件一件做,做完第一件才做第二件,就是阻塞式。非阻塞则是一件事需要等待,而他不等,他先开始做另一件事。以QQ聊天为例:对方收到你的回话之前,等在那里什么也不做,就是阻塞式。如果收到你的回话之前,先和第三个人聊两句,就是非阻塞。
已有帐号?
无法登录?
社交帐号登录}

我要回帖

更多关于 异步 非阻塞 区别 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信