异步非阻塞

199 阅读4分钟
原文链接: mp.weixin.qq.com

导语

在上文中《Nginx为什么要比Apache高性能之服务器原理篇 》提到服务的原理是处理socket连接,服务请求收到请求连接的时候,该以怎么样的方式去处理请求连接发送的数据呢?包括对数据流的监听、处理、响应。

我们也经常听说同步异步、阻塞非阻塞、异步非阻塞等等.....那我们今天就来了解下这几种调用方式。

同步和异步

同步和异步强调是通知的方式。

同步

同步是当函数调用发出之后,一直等待调用的结果。

举个栗子🌰:

小杰想看书了,就来到图书馆借书,到柜台跟管理员说:我想借一本《平凡的世界》。管理员说:你等着哈,我给你找。然后小杰就一直等着,直到管理员给她找书的结果。然后她拿着书才去继续做接下来要做的事。(小杰期望当时立即把找书的结果给他)

解释:小杰同步等待,直到得到管理员返回找书的结果,这个过程就是同步调用,就像我们调用一个函数,如果函数处理时间过长,卡住了,我们仍然要等着函数结束,获取到函数的返回结果。

异步

异步是当一个调用结束之后没有得到返回结果,补偿通知的方式获取结果。

举个栗子🌰:

小杰又想看书了,就跟管理员打电话说:我想借一本《围城》。管理员说:我这就给你找,一会儿再打给你。(小杰不期望管理员当时在电话里立即把找书的结果给她)

解释:小杰打电话的时候,管理员把结果返回给小杰的方式,不是在打电话的时候就返回的。而是管理员可能找书花费了1个小时(也可能更长时间),1个小时之后把结果通知给小杰的。

阻塞与非阻塞

阻塞非阻塞强调的是在调用发生之后进程是否挂起。

阻塞

函数调用开始之后,一直等待函数返回,什么也不做。(挂起)

举个栗子🌰:

(同步阻塞)小杰要借书,来到图书馆,让图书管理员帮忙找书,图书管理员在找书的过程中,小杰什么也不做,一直在等待管理员找书的结果。

(异步阻塞)小杰通过打电话给图书管理员,,打完电话之什么也不做,一直在等待管理员找书的结果。

解释:不管是同步还是异步,在等待调用结果的时候,都没有去做其他的事情。(进程挂起,有调用结果了重新唤醒进程)

非阻塞

举个栗子🌰:

(同步非阻塞)小杰借书的时候,来到图书馆,图书管理员在找书的过程中,一边刷手机,一直在等待管理员找书的结果。

(异步非阻塞)小杰借书的时候,打电话给图书管理员,打完电话之后,就去洗衣服去了,一边等待管理员找书结果的电话,一边洗衣服。

解释:同理,不管是同步还是异步,在等待调用结果的时候,转而做其他的事情。(进程没有挂起)

同步和异步、阻塞和非阻塞在真实场景里面也会根据实际情况进行选择。当然异步非阻塞用的是最多的。

Nginx在处理请求的时候,采用的是异步非阻塞原理,监听每个网络请求连接IO的是否有可读或者可写的事件发生。一个负责监听的守护进程可以同时响应多个网络请求连接。异步非阻塞是IO复用的基础。

Nginx的高性能的原因和IO复用离不开的。网络IO复用是什么呢?Apache和Nginx网络IO复用一样吗?有什么区别呢?欲知后事如何,且听后续分解。

注:《围城》《平凡的世界》都是非常好的书,建议大家去读一下。