0%

阻塞与非阻塞,同步与异步的联系和区别

先假设:A 发出一个请求到 B,期待想获得一个数据 c

阻塞(blocking-IO)与非阻塞(non-blocking-IO)

阻塞与非阻塞的区别在于,该请求是否能立即返回

  • 阻塞 请求要等B处理完c再返回(此处并没说,c会一起返回,这是“同步与异步”讨论的问题)
  • 非阻塞 请求立即返回,它只负责通知B,不会等待B处理完c

同步与异步

同步与异步的区别在于数据c是否和请求一起返回

  • 同步 数据跟随请求一起返回
  • 异步 数据不随请求一起返回。B通过其他方式(比如通知,回调)将数据发给A

为什么容易混淆

“同步需要等待数据c处理完,那么请求就不能立即返回,即阻塞。所以同步和阻塞是等价的”
其实不是。
如果我们用异步IO,他一旦发现数据c未准备好它会立即返回,但如果它还想拿到数据 c,那么在接下来的某个时间点,它需要再次发出请求,直到有一次获得的数据 c。所以异步IO也是同步的。

引用自参考资料:

在处理 IO 的时候,阻塞和非阻塞都是同步 IO。
只有使用了特殊的 API 才是异步 IO。

引用并感谢相关作者