一个通俗易懂的例子,带你彻底明白 同步异步,阻塞非阻塞

2024-05-28 09:44

本文主要是介绍一个通俗易懂的例子,带你彻底明白 同步异步,阻塞非阻塞,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

阻塞I/O(Blocking I/O)

例子:你亲自去仓库取书。

过程

  1. 你开车去仓库。
  2. 在路上花时间开车到仓库。
  3. 到了仓库后,排队等待拿到书。
  4. 拿到书后,开车回家。

在整个过程中,你自己(相当于程序)是完全被占用的,不能做其他事情。你必须等待所有步骤完成后,才能继续其他任务。

非阻塞I/O(Non-blocking I/O)

例子:你打电话给仓库,问有没有书,每隔一段时间打一次电话,直到书准备好了。

过程

  1. 你打电话问仓库有没有书。
  2. 仓库说还没有准备好,你挂掉电话,做其他事情。
  3. 每隔一段时间,你继续打电话询问,直到仓库说书准备好了。
  4. 你去仓库拿书。

在这个过程中,你可以做其他事情(相当于程序可以继续执行其他代码),每隔一段时间再检查一次是否书已经准备好。

同步I/O(Synchronous I/O)

例子:你需要等待仓库通知你书已经准备好,然后再去拿书。

过程

  1. 你向仓库发出请求,问有没有书。
  2. 仓库说会通知你,你挂掉电话,等待通知。
  3. 你收到仓库的通知(可能是电话或短信),说书已经准备好了。
  4. 你去仓库拿书。

在这个过程中,你的行动是按顺序进行的,你等待仓库的通知(相当于程序等待I/O操作完成)。

异步I/O(Asynchronous I/O)

例子:你向仓库发出请求,让他们送书到你家。

过程

  1. 你向仓库发出请求,让他们把书送到你家。
  2. 你继续做其他事情,不用等待。
  3. 仓库处理你的请求,准备书并派送到你家。
  4. 书送到你家,你收到书。

在这个过程中,你发出请求后可以立即做其他事情,仓库(相当于I/O设备)在后台处理你的请求,最后书自动送到你家(相当于I/O操作完成后通知程序)。

总结

  • 阻塞I/O:程序等待I/O操作完成,不能做其他事情。
  • 非阻塞I/O:程序发出I/O请求后,可以继续做其他事情,但需要不断检查I/O是否完成。
  • 同步I/O:程序等待I/O操作完成,按顺序执行任务。
  • 异步I/O:程序发出I/O请求后,立即继续做其他事情,I/O操作在后台完成,并在完成后通知程序。

这篇关于一个通俗易懂的例子,带你彻底明白 同步异步,阻塞非阻塞的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1010215

相关文章

Java中八大包装类举例详解(通俗易懂)

《Java中八大包装类举例详解(通俗易懂)》:本文主要介绍Java中的包装类,包括它们的作用、特点、用途以及如何进行装箱和拆箱,包装类还提供了许多实用方法,如转换、获取基本类型值、比较和类型检测,... 目录一、包装类(Wrapper Class)1、简要介绍2、包装类特点3、包装类用途二、装箱和拆箱1、装

异步线程traceId如何实现传递

《异步线程traceId如何实现传递》文章介绍了如何在异步请求中传递traceId,通过重写ThreadPoolTaskExecutor的方法和实现TaskDecorator接口来增强线程池,确保异步... 目录前言重写ThreadPoolTaskExecutor中方法线程池增强总结前言在日常问题排查中,

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

微服务架构之使用RabbitMQ进行异步处理方式

《微服务架构之使用RabbitMQ进行异步处理方式》本文介绍了RabbitMQ的基本概念、异步调用处理逻辑、RabbitMQ的基本使用方法以及在SpringBoot项目中使用RabbitMQ解决高并发... 目录一.什么是RabbitMQ?二.异步调用处理逻辑:三.RabbitMQ的基本使用1.安装2.架构

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

Python使用asyncio实现异步操作的示例

《Python使用asyncio实现异步操作的示例》本文主要介绍了Python使用asyncio实现异步操作的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录1. 基础概念2. 实现异步 I/O 的步骤2.1 定义异步函数2.2 使用 await 等待异

Python中的异步:async 和 await以及操作中的事件循环、回调和异常

《Python中的异步:async和await以及操作中的事件循环、回调和异常》在现代编程中,异步操作在处理I/O密集型任务时,可以显著提高程序的性能和响应速度,Python提供了asyn... 目录引言什么是异步操作?python 中的异步编程基础async 和 await 关键字asyncio 模块理论

Nacos集群数据同步方式

《Nacos集群数据同步方式》文章主要介绍了Nacos集群中服务注册信息的同步机制,涉及到负责节点和非负责节点之间的数据同步过程,以及DistroProtocol协议在同步中的应用... 目录引言负责节点(发起同步)DistroProtocolDistroSyncChangeTask获取同步数据getDis

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M