同步和异步,阻塞和非阻塞

发布时间 2023-03-30 14:20:35作者: ydssx

同步和异步,阻塞和非阻塞-结合一个例子简单说明

同步和异步

针对请求的客户端和请求的连接

例如:客户端有一个请求的连接,我要去请求服务器端处理一个数据返回一个结果,但是服务端计算这个结果的过程很长

在同步状态下面,这个连接就要处于一直等待的状态 ==》同步

客户端不想等了,发出请求后就想直接连接返回 ==》异步

在异步状态下客户端实际没有真正得到服务端返回的结果,所以在异步处理请求的方式下面往往还需要有一个消息回写的接口或者服务。待服务端把结果算出来后,再通过另一个消息回写把数据给你

阻塞和非阻塞

针对的是服务端的请求线程,或者说是服务端的处理线程

例如:客户端查询一个大数据,那么对于服务器的APP server端可以把它理解为请求线程,而实际数据库查这个数据的过程可以把它理解为处理线程

线程阻塞:在阻塞的情况下面,这个线程不能够去做其他的事情。请求线程要一直处于等待的状态

非阻塞:当请求线程发出请求给处理线程之后,不用一直在那等待,请求的线程可以快速的释放回资源池去处理其他的请求。但这个请求线程每隔10s,20s可能要去轮询下处理线程处理过程有没有完成。有完成后就拿着结果返回到客户端去

小结

同步和异步是针对客户端,针对请求的连接来说的

阻塞和非阻塞是针对服务端,针对请求的线程来说的

四种场景

2*2得到4种场景

假设顾客到餐馆去吃饭,顾客可以理解为请求端或客户端

到餐馆后发现任何一个餐馆既有服务员又有厨师,服务员可以理解为请求线程,厨师理解为处理线程

同步加阻塞

image

顾客点了一个菜,把点的菜交给服务员后,服务员再把点的菜传递给厨师,厨师拿到菜单马上就去做

顾客不能去做其他的事情,服务员把菜传给厨师后服务员也处于等待状态,不能去服务其他的顾客

同步加非阻塞

image

顾客点完菜以后同样不能够去做其他的事情,依然处于同步等待的状态

但这时服务员把菜单拿给后厨以后,服务员可以去服务其他的顾客。同时服务员可能每隔两分钟去问后厨菜是否做好

客户请求端仍然时刻等待,但是请求线程可以灵活的去做其他事情

异步加阻塞

image

点完菜以后,和服务员说自己出去溜达下,菜做好就服务员通知自己

服务员把菜单传给后厨以后,服务员一直在那等着

此时客户端可以灵活的去做其他事情,但请求线程处于绑定的状态

异步加非阻塞

image

作为顾客作为请求端可以灵活地去做其他事情

对于服务员把菜单传到后厨以后她也可以去服务其他顾客

异步下面的关键点

在异步时会启用处理线程端的消息队列

也就是说服务员把菜单传给后厨以后,会放在后厨的台面上面,这就是后厨的处理队列

特别的

当谈到异步时,没有必要去区分异步阻塞还是异步非阻塞

在异步的情况下面线程端阻塞和非阻塞没有意义

其他

异步的行为是增加吞吐量,并不能节省结果的处理时间。

阻塞和非阻塞是在线程层面说的。