前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >番外:同步异步阻塞非阻塞,了解一下?(十三节)

番外:同步异步阻塞非阻塞,了解一下?(十三节)

作者头像
老李秀
发布2020-02-19 11:50:41
6510
发布2020-02-19 11:50:41
举报

Hi,各位客官大家好,我是老李。

今天这一节严格意义上其实不能算一个章节而应该是一个番外篇。因为通过前面翔实而又丰富的内容中,我认为大家已经具备了可以理解[ 同步、异步、阻塞、非阻塞 ]的条件了。这TM四个名词不仅每个单拎出来恶心人,而且TA们之间还会相互组合产生四个更让人恶心的名词:

  • 同步阻塞
  • 同步非阻塞
  • 异步阻塞
  • 异步非阻塞

我记得我在前面讲解socket、select系统调用等文章的时候,结合代码反复解释过[ 非阻塞 ]与[ 阻塞 ]概念,今天这篇番外我通过一个举例说明来再次说明下这几个词的含义。当然了,由于本人水平有限,也不一定准确合适,欢迎后台发消息提出质疑以及更正!所有表达一概将由下篇文章补充发出。

你们还记得买馒头的阿星和卖馒头的阿梅么?

我就用[ 买馒头 ]和[ 卖馒头 ]来举例说明下吧,但是作为举例,这些例子很有可能不太会符合生活日常现象。

当然了,由于买馒头的声称自己同时是一个研究僧(seng,一声),所以我考虑下面用研究僧来称呼他。

  • 阻塞:研究僧去买馒头,阿梅告诉研究僧馒头还没好,于是研究僧就开始站在这里等馒头,注意这段时间研究僧啥也不想啥也不管,他紧紧盯着馒头蒸笼,只干一件事:只等馒头,别的啥也不干
  • 非阻塞:研究僧去买馒头,阿梅告诉研究僧馒头还没好,于是研究僧就开始拿出手机看看微信是否有人回复,然后又打开报纸看了两眼A股,紧接着又看两眼馒头,这段时间研究僧贼忙,不断地干不同的事情一直等到馒头出笼了
  • 同步:研究僧去买馒头,阿梅告诉研究僧馒头还没好,无论研究僧此时是[ 阻塞 ]还是[ 非阻塞 ]的,同步表现在于研究僧自己主动获得馒头是否已经出笼这个消息,阿梅不会提供通知研究僧
  • 异步:研究僧去买馒头,阿梅告诉研究僧馒头还没好,无论研究僧此时是[ 阻塞 ]还是[ 非阻塞 ]的,异步表现在于馒头好了后,阿梅会主动告诉研究僧

总结一下大概意思就是:

  • [ 阻塞 ]和[ 非阻塞 ]在于等馒头的时候,研究僧在干什么
  • [ 同步 ]和[ 异步 ]在于是研究僧自己主动获取馒头状态,还是被动由阿梅通知

只是[ 同步 ]和[ 阻塞 ]傻傻分不清,是因为他们表现的最终结果太像了。

只是[ 异步 ]和[ 非阻塞 ]傻傻分不清,是因为他们表现的最终结果太像了。

然后我们继续用[ 买卖馒头 ]来说明组合后的词语:

  • 同步阻塞:研究僧去买阿梅那里买馒头,馒头还没好,于是研究僧就自己等着馒头是否已经出炉的消息,而且在等待馒头的这段时间里,研究僧别的事情啥都不干
  • 同步非阻塞:研究僧去买阿梅那里买馒头,馒头还没好,于是研究僧就自己等着馒头是否已经出炉的消息,而且在等待馒头的这段时间里,研究僧会看手机微信是否收到消息、看下报纸新闻、然后很快就看馒头是否OK
  • 异步阻塞:研究僧去买阿梅那里买馒头,馒头还没好。但是阿梅会在馒头好了后告诉研究僧,但是研究僧依然站在一边儿等,而且在等的这段时间里,研究僧别的事情啥都不干
  • 异步非阻塞:研究僧去买阿梅那里买馒头,馒头还没好。但是阿梅会在馒头好了后告诉研究僧。研究僧则放飞自我,而且在放飞自我的这段时间里,研究僧会看手机微信是否收到消息、看下报纸新闻、偷窥

咋样,这波儿连比划带解释,xue微能说清楚了点儿了么?然后我再摆一张关于IO的分类,其实在APUE里关于IO分为下面五大类:

  • 阻塞IO
  • 非阻塞IO
  • IO多路复用
  • 信号驱动式IO
  • 异步IO

注意:前四个都是同步IO,而只有最后一个是异步IO。也就是说select\poll\epoll也是同步的,而在Linux下只有AIO(PHP中的扩展叫做EIO)是异步。

真是见了鬼了,Nginx事件是基于epoll实现的,但是大家一直对TA的印象就是[ 异步非阻塞 ];Swoole事件也是基于epoll实现的,也称[ 异步非阻塞 ],结果到这里你跟我说[ IO复用 ]是同步?

是的

这件事情我需要从头到尾来给大家叨叨一下了,主要问题就是:我们站在什么样的角度和场景去聊的[ 同步 ]和[ 异步 ]。

场景一:你和前端在联调业务,前端跟你来了一句[ 我ajax异步把数据提交给你 ]。这里异步是说什么?是说产品联调上的数据转送流程,毫无疑问他一定不是再跟你探讨IO复用、AIO,对吧?

场景二:PHP API这块儿在用户支付完成后,在成功的回调里把订单信息[ 异步 ]放到消息队列。这里的异步在说什么?是在说业务流的逻辑流程。我坚信你们的PHP代码在把消息放入消息队列的时候用的函数方法都是同步且阻塞,不可能是异步,所以这里说异步不可能在是在说IO复用、AIO。

场景三:Nginx是基于事件监听的异步非阻塞高性能服务器,这里的异步是在说什么?既然在Linux下Nginx事件是基于epoll实现的,然而上面又说了epoll这样的IO复用属于同步,那这里为什么会说[ 异步 ]非阻塞?因为它形容的是Nginx整体的事件处理流程,而不单单是说对epoll的调用,明白了吧。或者可以这么理解,Nginx对请求的上层逻辑流程是异步的,底层的实现是同步的。

那么真正意义上的异步是什么?在Linux下,指的就是AIO,唯有AIO才是真正符合定义(此处定义既指APUE中的经典异步定义)的异步!但实际上截止到目前为止,由于老李见识比较短浅,至今未发现Linux平台下基于AIO做出的比较重量级的应用,而且数量比较少见,更多还是基于IO复用。

所以如果是你自己想研究异步非阻塞,你要搞清楚此处异步是指什么;和他人在工作中提到了异步,都要搞明白具体的场景和立场是什么,两个人在一个频道上才能扯明白。对方说ajax异步提交数据,你却理解为AIO,能说到一块儿?两个人中必须得有一个包容对方的理解范围才能聊明白咋回事,不然纯粹就是两个糊涂蛋在各自频道上激情发挥。

下个章节通过代码实战来说明下[ 同步阻塞 ]和[ 同步非阻塞 ],AIO的咱就不碰了,有兴趣同学自己可以折磨下自己。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-02-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 高性能API社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档