zoukankan      html  css  js  c++  java
  • 同步异步以及阻塞和非阻塞的区别

    一、同步与异步的区别:

         同步:一个服务的完成需要依赖其他服务时,只有等待被依赖的服务完成后,才算完成,这是一种可靠的服务序列。要么成功都成功,失败都失败,服务的状态可以保持一致

           异步:一个服务的完成需要依赖其他服务时,只通知其他依赖服务开始执行,而不需要等待被依赖的服务完成,此时该服务就算完成了。被依赖的服务是否最终完成无法确定,一次它是一个不可靠的服务序列。

       

      消息通知中的同步和异步

    • 同步:当一个同步调用发出后,调用者要一直等待返回消息(或者调用结果)通知后,才能进行后续的执行;
    • 异步:当一个异步过程调用发出后,调用者不能立刻得到返回消息(结果)。在调用结束之后,通过消息回调来通知调用者是否调用成功

           调用者获取异步调用服务结果的两种方式:一种是主动去轮训查询异步回调的结果,一种调用依赖服务时传入一个callback方法或者回调地址,依赖服务完成之后去调用callback通知调用者,一般情况,这两种方式都要支持才是一种良好的异步回调设计方法。

    场景比喻:

     

    • 3.1、小明点单交钱,然后等着取奶茶;
    • 3.2、小明点单交钱,然后奶茶妹给了小明一个小票,等小明的奶茶做好了,再告诉小明来取;
    • 第一种方式就是同步,就等着奶茶妹做好奶茶,奶茶做好之后,小明拿到奶茶才算完成整个任务
    • 第二种方式就是异步,奶茶妹给了小明一个小票,小明就算完成了。至于最后奶茶做好没有,反正奶茶妹会告诉小明的,那是后面的事情了。

           所以: 同步与异步着重点在消息通知的方式,也就是调用结果通知的方式。

        

    二、阻塞与非阻塞的区别

         


       阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起,一直处于等待消息通知,不能够执行其他业务,函数只有在得到结果之后才会返回。

       非阻塞:非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

              

           虽然表面上看非阻塞的方式可以明显的提高CPU的利用率,但是也带了另外一种后果就是系统的线程切换增加

    1. 还有一点,在这里先扩展下:  
    2. (b) 如果这个线程在等待当前函数返回时,没有执行其他消息处理,而是处于挂起等待状态,那这种情况就叫做同步阻塞;  


    场景比喻:

    还是小明去买奶茶,可能会有两种方式

       

    • 2.1、小明点单交钱,然后等着取奶茶;

                 同步阻塞:小明在等着取奶茶的时候呢,啥都不干,就等着;小明等奶茶的行为就叫做阻塞,小明在等奶茶的时候,阻塞了!而这种方式又叫做同步阻塞。

                异步阻塞:小明在等着取奶茶的时候呢,翻出手机,一会翻翻微信朋友圈,一会瞅瞅奶茶妹有没有做好奶茶;小明这种行为就叫做非阻塞,因为没有阻塞在等奶茶这件事情上。而这种方式又叫做同步非阻塞。

    • 2.2、小明点单交钱,然后奶茶妹给了小明一个小票,等小明的奶茶做好了,再告诉小明来取

            异步阻塞:奶茶妹给了小明一个小票,然后小明还是傻等着;小明这种拿到票还傻等着的行为,就叫阻塞。而这种行为,又叫做异步阻塞!这种最傻了。

           异步非阻塞:奶茶妹给了小明一个小票,然后小明翻出手机一直刷朋友圈,过了一会儿奶茶妹说小明你的奶茶好了,过来拿,小明才放下手机去拿奶茶。这种方式就叫做非阻塞,又叫着异步非阻塞!


        所以:阻塞与非阻塞的着重点在于当前线程等待消息返回的行为。    

    • 1、同步阻塞:小明啥都不干等奶茶。
    • 2、同步非阻塞:小明一边玩手机一边等奶茶。
    • 3、异步阻塞:小明拿着小票啥都不干等着奶茶妹告诉他奶茶好了
    • 4、异步非阻塞:小明拿着小票玩着手机等着奶茶妹告诉他奶茶好了



  • 相关阅读:
    zepto源码--插入节点--学习笔记
    zepto源码--width,height--学习笔记
    zepto源码--$.map,$.each,$.grep--学习笔记
    zepto源码--isEmptyObject,isNumeric,inArray,trim--学习笔记
    zepto源码--filtered, contains,funcArg,setAttribute,className,deserializeVale--学习笔记
    zepto源码--qsa--学习笔记
    webstorm开发微信小程序
    第三方博客
    git最基础操作一
    vue-输入框change事件并获取值
  • 原文地址:https://www.cnblogs.com/matengfei123/p/7803690.html
Copyright © 2011-2022 走看看