同步/异步与阻塞/非阻塞

最近在看Python面试题,里面提到了异步,然后想起之前找资料弄清同步/异步与阻塞/非阻塞的区别,现在又忘记了。看来学到知识还是需要输出来,才能真正的理解记忆。

   我们经常看到某程序是采用异步阻塞的,这其中涉及到了两个角度的判断。 1. 消息通知机制。2. 等待消息通知时的状态。
总结来说:同步/异步关注的是消息通知的机制,阻塞/非阻塞关注的是等待消息通知的状态。

1、 同步与异步

  当依赖任务需要被依赖任务的完成之后,才能继续进行,这种叫做同步。当依赖任务不需要被依赖的任务的完成,只需要告诉被依赖任务需要做什么,然后执行自己的任务,不用管被依赖任务的完成情况,这叫做异步。
  接下来举个例子,在银行排队,最原始的排队,等着前面一个个办理完业务,这叫同步。慢慢,银行开始人性化了,有了叫号系统。你拿了自己的号码,然后做到休息的椅子上,等待柜员人员到时候叫你的号码,这就叫异步。
  综上看来,同步的情况下,是由处理消息者自己去等待消息是否被触发,例如自己观察前梦排队的还有多少人。而异步的情况下是由触发机制来通知处理消息,一般的触发机制有通知,状态与回调机制。因此,异步机制中,处理消息者与触发机制之间就需要一个连接的桥梁。

2、阻塞与非阻塞

  阻塞与非阻塞关注的是在等待消息时的状态。阻塞调用是指调用结果返回之前,当前线程会被挂起,一直处于等待消息通知,不能够执行其他业务。函数只有在得到结果之后才会返回。非阻塞调用是指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立即返回。虽然表面上看非阻塞的方式可以明显的提高CPU的利用率,但是也带来了另外一种后果就是系统的线程切换增加。增加的CPU执行时间能不能补偿系统的切换成本需要好好评估。
  再看看实例,刚才的排队情况,现在无所谓是同步/异步的消息通知机制,再等待消息通知的过程中,如果我玩手机和别人聊天,这就是非阻塞,如果一直傻傻的什么都不干,干等着消息,那就是同步。综合看来异步非阻塞效率最高,但是不同情况,需要的东西不同,需要选择最适合的模式。

参考文章:

《聊聊同步、异步、阻塞与非阻塞》--猿码道(https://www.jianshu.com/p/aed6067eeac9)

你可能感兴趣的:(同步/异步与阻塞/非阻塞)