Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >"女票"竟然问我什么是同步、异步、阻塞、非阻塞?

"女票"竟然问我什么是同步、异步、阻塞、非阻塞?

原创
作者头像
我是阿沐
修改于 2021-06-01 06:33:29
修改于 2021-06-01 06:33:29
6580
举报

1 故事的起源

哈喽,小伙伴们,大家好,我是阿沐!

大家应该看标题就知道了,今天要通过大白话+图形跟我女票(哪里来的女票?假想一下)讲解同步、异步、阻塞、非阻塞、并行、并发的理解。我女票是一个爱问问题的人,最喜欢没事问计算机方面的,尽管她是一名数学教师,尽管她学过计算机编程;但是我认为她啥都不会,有时候在我烦躁的问我,我会冲她发脾气,这里呢,认认真真(当面)跟女票道个歉,她纯粹是想帮我分忧解难。

今天就跟我女票唠一唠这个话题。

大家如果感兴趣,微信搜索「我是阿沐」关注我这枚有点神经但乐观的程序员~

2 什么是阻塞、非阻塞、同步、异步?

“老公我之前看你天天看操作系统的书的目录有阻塞和非阻塞,是个啥子意思嘛?是不是像我们平常坐地铁,有时候高峰期地铁🚇被堵了坐不上,有时候人又很少然后又不堵车了?”。你说说是啥意思嘛,是不是这样啊,撒个娇。

有这个点的意思,但是你这个只是片面的意思,我给你画图看看吧,这样你就一眼明白了。「我向来经受不住女生撒娇的

“从上面图形能看出来什么嘛?可以知道整体的流程是什么样子嘛?”,我对着女票问到

“老公,我看到了,看出来了”,女票兴奋激动的说道。

“快说说你看到什么了,难道我画的图结构这么清晰的嘛?我还以为你英文不咋地看不懂呢?”,我一脸期待的等着,脸上洋溢的微笑,我看到来自女票肯定的目光。

”老公你这个图画的挺好看的,用啥软件画的啊,好清晰哦!“,一脸崇拜的对我说。

”嚯嚯嚯,原来你看到的是这个啊!“,一盆冷水浇在了我的头上,冷冰冰的,女票你这是在侮辱我的画作;我还是对着图跟你讲一遍吧。

介绍一下图 1:

1)read用户请求调用read后,用户线程被阻塞。

2)no ready data内核没有准备好的数据。

3)data to cache准备好的数据放到内核缓存区。

  1. kernel copies data to user内核缓存区拷贝数据到用户空间。

5)copy data complete 数据拷贝完成返回给调用方使用

这么看来用户发起一个请求后,用户线程就会一直被阻塞,要等到内核把数据整理好拷贝给用户缓存区以后,请求才能拿到数据使用。整体的流程就是:内核从磁盘读数据进入内核缓存区;然后再把数据拷贝到用户缓存区;整个流程都处于阻塞状态中,必须一致进行下去,拿到结果才算完成一个请求。

总结阻塞是指:在请求调用拿到结果返回之前,当前的线程会被挂起。调用线程只有在得到结果之后才会被唤醒执行后续的操作。

介绍一下图 2:

基本逻辑跟阻塞一致,唯一不同的是:它多出了几次read请求(即轮询请求)。对,非阻塞主要就是体现在这里。

”那它是怎么体现出来的呢,老公可以举个简单的例子给我听听嘛,你专业术语我不是很明白“,一脸困惑迷茫的看着我。

举个例子论证给你听听:

例如:你坐地铁的时候,突然在安检门那边有个阿姨跟安检员吵起架了,阿姨扬言:”今天你要是不给老子一个说法,我跟你没玩,谁也别想过去“。阿姨搬个小板凳堵住门口,坐在哪里扣手机,时不时的询问那个安检员,这事怎么解决?那么这整个过程对于阿姨来说就是一个非阻塞操作。一边玩手机一边问安检员解决方案,说白了就是:你再等待解决方案的同时也没有闲着,可以在这个间隔时间期间做其他的事情,等到解决方案出来了,就完成了整个流程。

这里最后一步read操作是一个同步的一个过程,是需要线程去等待的过程;原因就是内核准备好了数据,要把数据拷贝到用户缓存区。

总结非阻塞是指:在调用结果没有返回之前,该调用不会阻塞住当前线程

同步

同步是指:用户发起一个请求,知道请求结果返回之后,才会进行下一步的操作逻辑。必须一件事一件事的去完成,只有前一个事情做完了,才轮到去做下面的事情。

例如:我们在疫情期间,去公园玩还是商场,我们都要通过“穗康码”登录,进行姓名、身份证进行实名认证,那么用户只有等待实名认证api有了响应结果,我们才能进行后续的扫码验证通过才能继续后面的事情。

异步

异步跟同步恰恰相反,两者的主要区别就是在于:是否需要等待结果集返回。用户进行读或者写操作后,将立刻返回,传入回调函数(callblack),然后内核开始去读取数据以及拷贝数据工作,完成之后通过回调函数用户可以立即处理数据(这个时候数据已经被复制到用户缓存区,不需要在获取)。

用通俗易懂的语言描述:

  • 阻塞/非阻塞:区别在于发起请求的人目前的线程/进程状态。一个是请求一直处于阻塞状态,用户什么都不能做;一个是用户在请求过程中可以做其他的,然后再等待结果。
  • 同步/异步:表示用户请求完成的方式,如果最终是由用户自己完成的,那么表示是同步;如果不是由自己完成而是别人完成之后通知用户接收的就是异步。主页术语区别:数据从内核拷贝到空户空间是否由用户线程来完成的

3 什么又是并行和并发呢?

女票的问题越来越有意思了,听我慢慢说哈,这里并行和并发经常会引起大家的误解,不少人区分不出来两者的差别在哪里?

其实但凡做过一些大型的项目,直播、电商、在线教育等等这种大型项目,第一个问题就是怎么解决并发,估计面试要是逃不掉的三高:高并发高性能高可用

并发和并行的区别程度还是蛮高的:主要就是看它是不是同时(PS:大学应该都会过计算机操作系统吧,前几页应该就有介绍并发和并行)

并发是指多个事件在同一时间间隔发生,而并行是指多个事件在同一时刻发生。言外之意:并发描述某个时间段,并行描述某个时间点

并行:当我们的cup是多核时,就能出现一个cpu在执行一个线程的同时,另外一个cpu可以执行另一个线程,它们两个相互不争抢cpu资源,在同一时刻,可以同时执行多种任务。

并发:当系统存在多个任务操作时,cpu会把运行时间分成多个时间段,然后分配个各个任务去执行,来回切换上下文,按照时间片来执行任务。

举例:

早上去公司吃早餐:早餐有小米粥、包子、豆浆、炒面,在规定的时间内,一会喝口粥、一会吃口包子、再一会吃口炒面,就这样来来回回的切换吃完了早餐 - 并发

吃早餐时发现你旁边同事跟你在同时吃早餐,互不影响,这就是一个并行的操作。

“哦哦哦,原来是这样啊,这计算机的概念是真的饶人啊,太难看懂了,还好有你能帮我白话一番。”,看着她那啥样子,我就想说这书上都有的概念,只要在实际项目中,遇到解决才能真正的理解这些。

最后总结

阻塞/非阻塞:主要是看应用程序等待消息通知的状态来看。阻塞当前线程被挂起,线程什么事情都不能做,只能等待有结果返回才能继续做下一件事情。非阻塞:在没有获取到结果时,可以继续做下面的事情;如果是同步非阻塞,就会通过轮询方式检查结果是否已经返回,否则就坐等通知,然后回调处理。

同步/异步:同步即是必须要等当前请求处理完才会直接返回结构,调用者在主动等待结果集。异步:用户发起请求后,被调用者直接返回结构,等待数据完成之后,通过回调函数或者状态的形式通知调用者接受数据处理,那么调用者处于被动接收结果集。这就是说为什么很多并发情况下,大家选择异步去处理业务逻辑。

这篇文章主要是讲下同步、异步、阻塞、非阻塞、并发、并行的概念性,并且通过实际的画图来解说他们到底是怎样的一种情况。可能大家在大学的时候学过《计算机组成原理》和《计算机操作系统》,这样就可以回顾看下了解下,毕竟面试的时候无论前端还是后端岗位都是必不可少的面试问题。

以上皆为个人对同步/异步/阻塞/非阻塞/并行/并发的理解,如有错误欢迎评论区指正。

参考文献

《计算机操作系统》

最后,欢迎关注我的个人公众号「我是阿沐」,会不定期的更新后端知识点和学习笔记。也欢迎直接公众号私信或者邮箱联系我,我们可以一起学习,一起进步。

好了,我是阿沐,一个不想30岁就被淘汰的打工人 ⛽️ ⛽️ ⛽️ 。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Mybatis批量插入或更新的正确姿势
另外一篇博客是对本文的补充,也可以参考一下:https://blog.csdn.net/w605283073/article/details/88652042
全栈程序员站长
2022/11/18
1.8K0
Mybatis批量插入或更新的正确姿势
求求你们了,MyBatis 批量插入别再乱用 foreach 了,5000 条数据花了 14 分钟。。
点击关注公众号,Java干货及时送达 近日,项目中有一个耗时较长的Job存在CPU占用过高的问题,经排查发现,主要时间消耗在往MyBatis中批量插入数据。 mapper configuration是用foreach循环做的,差不多是这样。(由于项目保密,以下代码均为自己手写的demo代码) <insert id="batchInsert" parameterType="java.util.List">     insert into USER (id, name) values     <foreach
Java技术栈
2022/08/25
1.2K0
求求你们了,MyBatis 批量插入别再乱用 foreach 了,5000 条数据花了 14 分钟。。
Mybatis Plus 批量插入性能优化,非常实用!
物联网平台背景,传感器采集频率干到了1000Hz,分了100多张表出来,还是把mysql干炸了。当前单表数据量在1000来w,从kafka上拉数据异步批量插入,每次插入数据量1500条,测试的时候还没问题,结果上线没多久,kafka服务器直接挂了,赶忙看日志,kafka服务器堆积了几十G的数据,再去看生产环境日志,发现到最后单次批量插入用时固定在10多秒,甚至20多秒,kafka直接把消费端踢出了消费组…从而kafka消息一直没有消费,总重导致kafka数据堆积挂掉了…
码猿技术专栏
2023/05/01
8K2
Mybatis Plus 批量插入性能优化,非常实用!
MyBatis批量插入之forEach与Batch的抉择
创建数据表,并设置22个字段。也许你会好奇为什么创建如此多字段呢?因为只有在多字段且数据量较大时,才能体现BATCH的优势。也就是说在数据表字段较少,且保存的数据量不多的情况呀,forEach实现的批量插入还是有优势的,但是却有一个隐含的风险,这里先按下不表。
猫老师的叶同学
2023/03/23
2K0
MyBatis批量插入之forEach与Batch的抉择
MyBatis 批量插入几千条数据,请慎用Foreach
近日,项目中有一个耗时较长的Job存在CPU占用过高的问题,经排查发现,主要时间消耗在往MyBatis中批量插入数据。mapper configuration是用foreach循环做的,差不多是这样。(由于项目保密,以下代码均为自己手写的demo代码)
搜云库技术团队
2021/12/16
1.3K0
MyBatis 批量插入几千条数据,请慎用Foreach
13 秒插入 30 万条数据,批量插入正确的姿势!
超出最大数据包限制了,可以通过调整max_allowed_packet限制来提高可以传输的内容,不过由于30万条数据超出太多,这个不可取,梭哈看来是不行了 😅😅😅
好好学java
2024/04/10
1.2K0
13 秒插入 30 万条数据,批量插入正确的姿势!
真正的mybatis-plus批量插入(Mysql语法)
mybatis-plus内置提供了InsertBatchSomeCulumn来实现真批量插入,但是由于只支持MySQL的语法格式,所以没有在通用的API作为默认使用。
用户1448294
2023/10/27
7.1K0
MyBatis-14MyBatis动态SQL之【foreach】
虽然可以使用{ids}方式直接获取值,但{ids}不能防止SQL注入, 想要避免SQL注入就需要用#{}的方式,这时就要配合使用foreach标签来满足需求.
小小工匠
2021/08/17
6460
mybatis-plus批量插入你用对了吗
记得有一次我们小组code review,组长看了下我们批量插入是使用mybatis原生的xml foreach实现的,于是二话不说,拍桌子,说这有性能问题。叫我们直接使用mybatis-plus,可是为啥呢?怎么用,需要注意哪些地方,也没给我们说个明白。好吧,我们对这一块也没具体调研过,就直接按他的想法去实现了。性能有没有提升了好几倍呢,其实也没实践过,反正review过了。直到有一天。。。
阿建dong一点
2022/11/26
4.1K1
mysql批量写入_mysql insert多条数据
最近新的项目写了不少各种 insertBatch 的代码,一直有人说,批量插入比循环插入效率高很多,那本文就来实验一下,到底是不是真的?
全栈程序员站长
2022/11/08
7K0
mysql批量写入_mysql insert多条数据
求求你们了,MyBatis 批量插入别再乱用 foreach 了,5000 条数据花了 14 分钟。。
近日,项目中有一个耗时较长的Job存在CPU占用过高的问题,经排查发现,主要时间消耗在往MyBatis中批量插入数据。mapper configuration是用foreach循环做的,差不多是这样。(由于项目保密,以下代码均为自己手写的demo代码)
搜云库技术团队
2023/10/30
2.3K0
求求你们了,MyBatis 批量插入别再乱用 foreach 了,5000 条数据花了 14 分钟。。
Mybatis系列第四讲 Mybatis使用详解(2)
SqlSession相当于一个连接,可以使用这个对象对db执行增删改查操作,操作完毕之后需要关闭,使用步骤:
易兮科技
2020/09/26
6950
MyBatis批量插入大量数据(1w以上)
问题背景:只用MyBatis中foreach进行批量插入数据,一次性插入超过一千条的时候MyBatis开始报错。项目使用技术:SpringBoot、MyBatis
用户7353950
2022/06/23
2K0
数据库批量插入这么讲究的么?
最近新的项目写了不少各种 insertBatch 的代码,一直有人说,批量插入比循环插入效率高很多,那本文就来实验一下,到底是不是真的?
秦怀杂货店
2022/01/04
1.1K0
02-MybatisPlus批量插入性能够吗?
“不要用 mybatis-plus 的批量插入,它其实也是遍历插入,性能很差的”。真的吗?他们的立场如下:
JavaEdge
2025/06/01
1180
02-MybatisPlus批量插入性能够吗?
mybatis中批量插入的两种方式(高效插入)
mybatis中批量插入的两种方式(高效插入)
Java架构师必看
2021/09/30
2.4K0
MyBatis:缓存,延迟加载,注解应用
实际开发过程中很多时候并不需要总是在加载用户信息时就一定要加载他的订单信息。此时就是我们所说的延迟加载。
RendaZhang
2020/09/08
9730
MyBatis:缓存,延迟加载,注解应用
MyBatis 批量插入别再乱用 foreach 了,5000 条数据花了 14 分钟...
来源:blog.csdn.net/huanghanqian/article/details/83177178/ 近日,项目中有一个耗时较长的Job存在CPU占用过高的问题,经排查发现,主要时间消耗在往MyBatis中批量插入数据。mapper configuration是用foreach循环做的,差不多是这样。(由于项目保密,以下代码均为自己手写的demo代码) <insert id="batchInsert" parameterType="java.util.List">     insert into 
程序猿DD
2022/09/08
1K0
MyBatis 批量插入别再乱用 foreach 了,5000 条数据花了 14 分钟...
MyBatis一次性批量插入几千条数据,为什么性能很差?
近日,项目中有一个耗时较长的Job存在CPU占用过高的问题,经排查发现,主要时间消耗在往MyBatis中批量插入数据。mapper configuration是用foreach循环做的,差不多是这样。
Java技术债务
2022/08/09
4.2K0
MyBatis一次性批量插入几千条数据,为什么性能很差?
java进阶|MyBatis系列文章(五)注解版批量操作的增删改查
六,由于这里都是基于自己的测试操作,写法上不满足正规的流程,比如说这里直接在controller层调用了userMapper的方法操作数据库,正常的应该还有一个userService接口的操作,这里简单了一些。
码农王同学
2020/04/27
2.1K0
推荐阅读
相关推荐
Mybatis批量插入或更新的正确姿势
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档