• 同步、异步 阻塞、非阻塞


    1、同步与异步

      同步与异步主要是从消息通知机制的角度来说的。

      所谓同步就是说一个任务的完成需要依赖另一个任务,只有当被依赖的任务完成后,依赖的任务才能算完成,只是一种可靠的任务序列。所谓异步就是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了。

      当一个同步调用发出后,调用者要一直等待返回消息通知后,才能进行后续的执行;当一个异步调用发出后,调用者不能立刻得到返回消息,实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。如果使用状态来通知的话,那么调用者需要每隔一定时间检查一次,效率比较低;如果使用通知或者回调的方式,则效率很高。

    2、阻塞与非阻塞

      阻塞与非阻塞这两个概念与程序等待消息时的状态有关,也就是说阻塞与非阻塞主要是程序(线程)等待消息通知时的状态角度来说的。

      阻塞调用是指调用结果返回之前,当前线程会被挂起,一直处于等待消息通知,不能执行其他业务。

      非阻塞和阻塞的概念相反,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回,虽然表面上非阻塞可以明显提高CPU的利用率,但是也带来了另一种后果就是系统的线程切换增加。增加的CPU执行时间能不能补偿系统的切换成本需要好好评估。

       很多人可能会把同步调用和阻塞调用等同起来,其实他们是不一样的:

       对于同步调用来讲,很多当前线程可能还是激活的,只是从逻辑上讲当前函数没有返回而已,此时这个线程可能也会处理其他的消息,如果这个线程在等待当前函数返回的同时还在执行其他的消息处理,这种情况就叫做同步非阻塞,如果没有执行其他的消息处理,而是处于挂起等待状态,那么就叫做同步阻塞。

       对于阻塞调用来讲,则当前线程就会被挂起等待当前函数退出。

      综上所述,同步和异步仅仅是关注消息如何通知的机制,而阻塞和非阻塞是等待消息通知时的状态。也就是说在同步的情况下,是由处理消息者自己去等待消息是否被触发,而异步的情况下是由触发机制来通知处理消息者,所以在异步机制中,处理消息者和触发机制之间就需要一个连接的桥梁。

  • 相关阅读:
    Chrome控制台JS设置xpath定位
    logging.exception
    python去除换行和空格
    从剪切板获取的内容无法使用type函数得到数据类型
    python获取剪切板的内容
    hdoj Radar Installation
    hdoj- Windows Message Queue
    hdoj-看病要排队
    hdoj-1896 stones
    评委会打分
  • 原文地址:https://www.cnblogs.com/shark-cf/p/5451300.html
Copyright © 2020-2023  润新知