zoukankan      html  css  js  c++  java
  • 同步与异步&阻塞与非阻塞

    摘要

    一直为同步异步,阻塞非阻塞概念所困扰,特定总结了下,原来是这么个意思

    一直为同步异步,阻塞非阻塞概念所困扰,特定总结了下

    一、同步与异步的区别

    1、概念介绍

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

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

    2、消息通知

    • 同步:当一个同步调用发出后,调用者要一直等待返回消息(或者调用结果)通知后,才能进行后续的执行;

    • 异步:当一个异步过程调用发出后,调用者不能立刻得到返回消息(结果)。实际处理这个调用的部件在完成后,通过消息回调来通知调用者是否调用成功。

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

    3、场景比喻

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

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

    4、总结

    同步与异步着重点在消息通知的方式,也就是调用结果通知的方式。结合场景就是,拿到奶茶的方式。

    二、阻塞与非阻塞的区别

    1、概念介绍

    • 阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起,一直处于等待消息通知,不能够执行其他业务。函数只有在得到结果之后才会返回。
    阻塞调用和同步调用不同的。
    对于同步调用来说,很多时候当前线程可能还是激活的,只是从逻辑上当前函数没有返回而已,此时,这个线程可能也会处理其他的消息。
    
    还有一点,在这里先扩展下:
    1.如果这个线程在等待当前函数返回时,仍在执行其他消息处理,那这种情况就叫做同步非阻塞;
    2.如果这个线程在等待当前函数返回时,没有执行其他消息处理,而是处于挂起等待状态,那这种情况就叫做同步阻塞;
    
    所以同步的实现方式会有两种:同步阻塞、同步非阻塞;同理,异步也会有两种实现:异步阻塞、异步非阻塞;
    对于阻塞调用来说,则当前线程就会被挂起等待当前函数返回;
    
    • 非阻塞:非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。
      虽然表面上看非阻塞的方式可以明显的提高CPU的利用率,但是也带了另外一种后果就是系统的线程切换增加。
      增加的CPU执行时间能不能补偿系统的切换成本需要好好评估。
      

    2、场景比喻

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

    • 2.1、小明点单交钱,然后等着取奶茶; ``` 1、小明在等着取奶茶的时候呢,啥都不干,就等着; 小明等奶茶的行为就叫做阻塞,小明在等奶茶的时候,阻塞了!而这种方式又叫做同步阻塞。

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

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

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

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

    3、总结

    阻塞与非阻塞的着重点在于当前线程等待消息返回的行为。换成场景就是,小明等奶茶的行为。

    三、大总结

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

    转自http://my.oschina.net/haoran100/blog/707197

  • 相关阅读:
    Debian双网卡配置
    Linux服务器双网卡双IP和单网卡双IP配置方法(Debian/Ubuntu)
    Debian系列网卡配置详解
    Debian下配置IPV6和静态路由
    Ubuntu Server系统修改IP地址
    Centos7新增静态路由
    Debian添加静态路由的正确姿势
    Linux 更改时区、时间
    Apache 2.4自签名证书及客户端SSL认证
    【计划】
  • 原文地址:https://www.cnblogs.com/Bonker/p/5652316.html
Copyright © 2011-2022 走看看