专栏首页可能是东半球最正规的API社区番外:同步异步阻塞非阻塞,了解一下?(十三节)

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

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的咱就不碰了,有兴趣同学自己可以折磨下自己。

本文分享自微信公众号 - 高性能API社区(high-performance-api),作者:老李秀

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-02-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ELK从入门到还未精通(二)——ElasticSearch上篇

    上一篇,大致介绍了作为工具人的我是如何基本使用这一套ELK 系统的。今天就讲讲这个最重要的E——基于Lucene的搜索引擎ElasticSearch(后面简称E...

    老李秀
  • 老旧话题:重新看看PHP的session

    这基本上算是个老旧的话题了,几乎所有phper在第一次面试的时候都会被问到关于session的问题,如果不出意外,往往是如下三板斧:

    老李秀
  • 接着搞【附近】---Elasticsearch还是Postgre?(四)

    果不其然,第三篇出去后就有很多人在问我为毛没有PostGIS,其实我内心的小算盘是:如果你们不提这玩意我就不写了,你们提了我就安排到后面补充一下。

    老李秀
  • 1084: [SCOI2005]最大子矩阵

    1084: [SCOI2005]最大子矩阵 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1325  Sol...

    HansBug
  • Hygieia-你值得拥有!!!(下篇)

    书接上篇,我们介绍了Hygieia的架构图、应用的的技术、以及主要工程的搭建步骤,现在Hygieia系统已经能够完整的运行起来了,但是如果要充分发挥Hygiei...

    用户5521279
  • 基于RGW的多媒体处理框架

    业务需要在原有RGW的服务基础上加上对多媒体类资源的处理,比如图片resize、视频转码等。参考过多个厂家的设计,发现对方的多媒体类处理都是在URL里面加上qu...

    用户1260683
  • 文本分析在收集产品反馈时的作用

    文本分析现在已经能够在多个行业实现应用,今天灵玖软件从收集产品回馈方面来讲一下文本分析的作用。

    用户6287968
  • 如何用数学知识提升情商?数学学霸们的6大思维习惯

    引言:成为一名“数学学霸”显然不是一件轻松的工作,不仅需要“高智商”的支持,还一不小心就被套上了“情商低”“Nerd”的“帽子”。

    华章科技
  • 如何用数学知识提升情商?数学学霸们的6大思维习惯

    大数据文摘
  • 我对软件工程这门课的理解

    微信公众号:compassblog 欢迎关注,互相学习,共同进步! 有任何问题,请后台留言联系! 阅读本文大概需要 2.3 分钟 谈谈自己对软件工程这么课的理解...

    compassblog

扫码关注云+社区

领取腾讯云代金券