老张喝茶 教你同步异步 阻塞与非阻塞

通过老张烧水的不同方式,形象地解释了同步与异步、阻塞与非阻塞的概念,并探讨了不同场景下各自的适用性和效率。

老张爱喝茶,废话不说,煮开水。

出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。

1 老张把水壶放到火上,立等水开。(同步阻塞

老张觉得自己有点傻

2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞

老张还是觉得自己有点傻,于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀~~~~的噪音。

3 老张把响水壶放到火上,立等水开。(异步阻塞

老张觉得这样傻等意义不大

4 老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞

老张觉得自己聪明了。

 


 

所谓同步异步,只是对于水壶而言。

普通水壶,同步;响水壶,异步。

虽然都能干活,但响水壶可以在自己完工之后,提示老张水开了。这是普通水壶所不能及的。

同步只能让调用者去轮询自己(情况2中),造成老张效率的低下。

 

所谓阻塞非阻塞,仅仅对于老张而言。

立等的老张,阻塞;看电视的老张,非阻塞。

情况1和情况3中老张就是阻塞的,媳妇喊他都不知道。虽然3中响水壶是异步的,可对于立等的老张没有太大的意义。所以一般异步是配合非阻塞使用的,这样才能发挥异步的效用。

 

程序员写程序,很多情况下,老张和水壶都要涉及,即调用者与被调用者。四种组合模式各有所长。

这个例子和银行排队有异曲同工之妙,可是我觉得这个会比较容易理解一些。

老张一次比一次聪明,我承认跟老张很像。刚开始的情况逻辑比较简单,但效率低下。随着慢慢的提高,效率也提高了。所以个人认为,程序的效率和简单程度是成反比的。

但不是说异步非阻塞就一定是最好的,有的情况下更适合使用同步或者阻塞。

己有能 勿自私 人所能 勿轻訾 jogger0703@gmail.com
同步异步阻塞和非阻塞是描述程序执行和通信机制的重要概念,它们分别关注不同的方面,但常常被混淆。理解这些概念有助于更高效地设计和实现程序。 ### 同步异步 同步异步主要描述的是消息通信的机制。同步操作是指调用者必须等待调用的结果返回后才能继续执行后续操作。例如,在同步数据库查询中,调用者会等待查询结果返回后才继续执行[^4]。异步操作则允许调用者在发出调用后立即继续执行其他任务,结果会在稍后通过某种机制(如回调、通知)返回[^4]。 以小明下载文件为例,同步意味着小明会一直等待文件下载完成,而异步则意味着小明可以在下载开始后去做其他事情,下载完成后会收到通知[^3]。 ### 阻塞与非阻塞 阻塞和非阻塞关注的是程序在等待调用结果时的状态。阻塞调用意味着调用者在等待结果时会被挂起,不能执行其他任务。非阻塞调用则允许调用者在等待结果的同时执行其他任务[^4]。 回到小明的例子,阻塞状态意味着小明在等待文件下载时无法做其他事情,而非阻塞状态则意味着小明可以在下载过程中去做其他事情,偶尔检查下载是否完成[^3]。 ### 同步异步阻塞与非阻塞的组合 这些概念可以组合成四种情况: 1. **同步阻塞**:调用者等待调用结果,并在此期间被挂起。例如,老张把水壶放到火上,立等水开。 2. **同步阻塞**:调用者在等待调用结果时可以执行其他任务。例如,老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。 3. **异步阻塞**:调用者在发出调用后立即继续执行,但在等待结果时被挂起。例如,老张把响水壶放到火上,立等水开。 4. **异步阻塞**:调用者在发出调用后立即继续执行,且在等待结果时不被挂起。例如,老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶[^5]。 ### 示例代码 以下是一个简单的异步编程示例,使用Python的`asyncio`库: ```python import asyncio async def download_file(): print("开始下载文件") await asyncio.sleep(2) # 模拟下载过程 print("文件下载完成") async def main(): await download_file() # 运行异步任务 asyncio.run(main()) ``` 在这个例子中,`download_file`函数模拟了一个异步下载过程,`main`函数启动了这个异步任务,而主程序不会阻塞等待下载完成,而是可以继续执行其他任务。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值