• Title


    一、同步与异步

     首先,同步与异步是消息的通信机制

    • 同步就是在发出一个功能调用后,在没有得到结果之前,该调用不会返回,如果调用返回了,那就证明有返回值了。调用者主动等待调用结果。
    • 异步就是在发出一个功能调用后,调用就马上返回了,但是没有在那一刻马上返回结果(功能调用需要时间执行才会返回结果),简单来说就是调用发出后,调用者不会马上得到结果,而是通过被调用者通过状态、通知调用者,或者是回调函数来通知调用者,在调用者收到结果之前,完全可以去干别的事情,而不是一味的等待结果的返回。如果异步功能用状态来通知,那么调用者就需要每隔一定时间检查一次,效率就很低(有些初学多线程编程的人,总喜欢用一个循环去检查某个变量的值,这其实是一 种很严重的错误)。如果是使用通知的方式,效率则很高,因为异步功能几乎不需要做额外的操作。至于回调函数,其实和通知没太多区别。

          小结:同步与异步针对的是函数/任务的调用方式:同步就是当一个进程发起一个函数(任务)调用的时候,一直等到函数(任务)完成,而进程继续处于激活状态。而异步情况下是当一个进程发起一个函数(任务)调用的时候,不会等函数返回,而是继续往下执行当,函数返回的时候通过状态、通知、事件等方式通知进程任务完成。

    二、阻塞与非阻塞

     阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态

    • 阻塞调用是指调用结果返回之前,当前线程会被挂起(如遇到io操作)。函数只有在得到结果之后才会将阻塞的线程激活。有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。
    • 非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。

         小结:阻塞与非阻塞针对的是进程或线程:阻塞是当请求不能满足的时候就将进程挂起,而非阻塞则不会阻塞当前进程。

    三、举例

    老张爱喝茶,废话不说,煮开水。
    出场人物:老张,水壶两把(普通水壶,简称水壶会响的水壶,简称响水壶)。


      1 老张把水壶放到火上,立等水开。(同步阻塞)
        老张觉得自己有点傻


      2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞)
        老张还是觉得自己有点傻,于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀~~~~的噪音。


      3 老张把响水壶放到火上,立等水开。(异步阻塞)
        老张觉得这样傻等意义不大


      4 老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞)
        老张觉得自己聪明了。


    同步异步,只是对于水壶而言。
    普通水壶,同步;响水壶,异步。
    虽然都能干活,但响水壶可以在自己完工之后,提示老张水开了。这是普通水壶所不能及的。
    同步只能让调用者去轮询自己(情况2中),造成老张效率的低下。

    阻塞非阻塞,仅仅对于老张而言。
    立等的老张,阻塞;看电视的老张,非阻塞。
    情况1和情况3中老张就是阻塞的,媳妇喊他都不知道。虽然3中响水壶是异步的,可对于立等的老张没有太大的意义。所以一般异步是配合非阻塞使用的,这样才能发挥异步的效用。

    ——来源网络,作者不明。
    以上内容均来自于:林海峰知乎

    扩展知识链接:I/O模型

  • 相关阅读:
    vue 手动挂载 $amount()
    Redis 主从配置
    DMA分区管理
    C# 构造函数里的base和this的区别
    SQL Server 数据库性能优化
    TCP和UDP的优缺点及区别
    Django框架初步应用简述
    前端vue框架应用雏形
    接口mock之moco
    python进阶(九)~~~协程、进程池、线程/进程/协程对比
  • 原文地址:https://www.cnblogs.com/guotianbao/p/8043525.html
Copyright © 2020-2023  润新知