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

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

相关文章

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Java 中实现异步的多种方式

《Java中实现异步的多种方式》文章介绍了Java中实现异步处理的几种常见方式,每种方式都有其特点和适用场景,通过选择合适的异步处理方式,可以提高程序的性能和可维护性,感兴趣的朋友一起看看吧... 目录1. 线程池(ExecutorService)2. CompletableFuture3. ForkJoi

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

《MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固通俗易懂版)》本文主要讲解了MySQL中的多表查询,包括子查询、笛卡尔积、自连接、多表查询的实现方法以及多列子查询等,通过实际例子和操... 目录复合查询1. 回顾查询基本操作group by 分组having1. 显示部门号为10的部门名,员

Linux搭建Mysql主从同步的教程

《Linux搭建Mysql主从同步的教程》:本文主要介绍Linux搭建Mysql主从同步的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux搭建mysql主从同步1.启动mysql服务2.修改Mysql主库配置文件/etc/my.cnf3.重启主库my

Go使用pprof进行CPU,内存和阻塞情况分析

《Go使用pprof进行CPU,内存和阻塞情况分析》Go语言提供了强大的pprof工具,用于分析CPU、内存、Goroutine阻塞等性能问题,帮助开发者优化程序,提高运行效率,下面我们就来深入了解下... 目录1. pprof 介绍2. 快速上手:启用 pprof3. CPU Profiling:分析 C

Spring Boot 中正确地在异步线程中使用 HttpServletRequest的方法

《SpringBoot中正确地在异步线程中使用HttpServletRequest的方法》文章讨论了在SpringBoot中如何在异步线程中正确使用HttpServletRequest的问题,... 目录前言一、问题的来源:为什么异步线程中无法访问 HttpServletRequest?1. 请求上下文与线

在 Spring Boot 中使用异步线程时的 HttpServletRequest 复用问题记录

《在SpringBoot中使用异步线程时的HttpServletRequest复用问题记录》文章讨论了在SpringBoot中使用异步线程时,由于HttpServletRequest复用导致... 目录一、问题描述:异步线程操作导致请求复用时 Cookie 解析失败1. 场景背景2. 问题根源二、问题详细分

Java中将异步调用转为同步的五种实现方法

《Java中将异步调用转为同步的五种实现方法》本文介绍了将异步调用转为同步阻塞模式的五种方法:wait/notify、ReentrantLock+Condition、Future、CountDownL... 目录异步与同步的核心区别方法一:使用wait/notify + synchronized代码示例关键

springboot的调度服务与异步服务使用详解

《springboot的调度服务与异步服务使用详解》本文主要介绍了Java的ScheduledExecutorService接口和SpringBoot中如何使用调度线程池,包括核心参数、创建方式、自定... 目录1.调度服务1.1.JDK之ScheduledExecutorService1.2.spring