当前位置: 首页 > 后端技术 > PHP

吃透同步、异步、阻塞、非阻塞的概念知识

时间:2023-03-29 19:27:04 PHP

IO需要对IO的概念有一定的了解:我们通常使用php的fopen打开文件和关闭文件进行读写,称为本地文件IO;在socket编程中,本质其实就是网络IO;synchronousasynchronousblockingnon-blocking反正我之前一直搞不清楚同步和阻塞,异步和非阻塞的概念。总觉得同步是阻塞的,异步是非阻塞的。如有不妥欢迎大家指正;简单来说,同步:同步体现在等待一件事的处理结果时,对方是否提供通知服务,如果对方不提供通知服务,则为同步;异步:异步体现在等待处理一件事情的结果时,对方是否提供通知服务,如果对方提供通知服务,则为异步;对于普通的Ajax请求,前端通常会在Ajax请求之后进行一些其他的加载操作(非阻塞);在服务器端处理完后,会将数据‘通知’到前端页面;最近刚看的RabbitMQ消息队列系统,虽然本质上也是异步的(通过数据的发送和接收分离来解耦应用,数据最终被消费者处理后,生产者不会收到通知,因为消息系统使用了很多持久化、重试等手段来保证消息一定会被执行),但本质上是消息发送成功后会立即得到响应,所以只要生产者成功生产消息,实际上是同步的;blocking:阻塞体现在你在等待一件事情的处理结果的过程中是否在做其他事情,如果你不去,就是阻塞;非阻塞:非阻塞体现在你在等待一件事情的处理结果的同时,是否在做其他事情,如果去做,就是非阻塞;结合这里的例子找了一个朋友写的例子,感觉很好同步阻塞:你去甜心馒头店买太极馒头,阿妹说:“还没呢,正在蒸呢,你自己看!”,所以你就站着等馒头,这时候,你是阻塞同步的;堵就是什么都不做,只等馒头;同步是指阿妹在等包子的过程中不提供通知服务,你要主动查看“馒头出炉”的消息;同步非阻塞:你去天在心馒头店买太极馒头,阿妹说:“还没呢,蒸着了,你自己看!”,所以你就站在一旁发个微信,然后问:“你还好吗?”,然后玩QQ游戏,然后问:“你还好吗?”这时候你是非阻塞的,但还是Synchronous的;非阻塞是指除了等待包子,还可以还在做其他事情;同步演出在等包子的过程中,因为阿妹不提供通知服务,你要主动查看“馒头出来了”的消息;异步阻塞:你去甜在心馒头店买太极馒头,阿妹说:“还没呢,正在蒸呢,蒸完了我叫你!”,你还是站在旁边等馒头.这时候,你是阻塞的,是异步的;阻塞表现在你除了等包子,其他什么都没做(比如玩手机);异步表现在等待包子的过程中。阿梅提供电话通知“馒头出炉”的消息。你只需要等阿梅的电话即可;异步无阻塞:你去天在新馒头店买太极馒头,阿梅说:“还没呢,正在蒸,做好了我会打电话通知你!”,于是你去买一双新运动鞋,我看了看武馆,总之,以后再也不理馒头了,等阿梅的电话就好了。这时候你就是非阻塞的,异步非阻塞的。除了等馒头,你还得自己做一些其他的事情;异步表现在等待包子的过程中,阿梅提供电话通知“包子出炉”的消息,你只需要等阿梅的电话即可;