深入理解:同步阻塞与异步阻塞

news2025/1/5 22:22:48

文章目录

      • **同步阻塞与异步阻塞:深入理解并整理技术分享**
    • **1. 基本概念回顾**
      • **1.1 同步与异步**
      • **1.2 阻塞与非阻塞**
      • **总结:不同维度**
    • **2. 同步/异步 与 阻塞/非阻塞的组合**
      • **2.1 同步阻塞**
      • **2.2 同步非阻塞**
      • **2.3 异步阻塞**
      • **2.4 异步非阻塞**
    • **3. 组合关系总结**
    • **4. 实际应用场景分析**
      • **4.1 同步阻塞**
      • **4.2 同步非阻塞**
      • **4.3 异步阻塞**
      • **4.4 异步非阻塞**
    • **5. 总结与建议**

同步阻塞与异步阻塞:深入理解并整理技术分享

在软件开发中,“同步与异步”、“阻塞与非阻塞”是两个非常常见且重要的概念。它们广泛应用于多线程、I/O 操作和网络编程等领域。然而,这两个概念经常容易被混淆,因为它们关注的维度不同。本文将系统讲解 同步与异步阻塞与非阻塞 的区别及交叉组合(如同步阻塞、异步阻塞等),帮助开发者全面理解并在实际项目中灵活运用。


1. 基本概念回顾

在深入讨论组合之前,我们需要先厘清 同步 & 异步阻塞 & 非阻塞 这两个核心概念。

1.1 同步与异步

  • 同步:描述任务的执行模式,调用者必须等待任务完成之后才能继续后续操作。

    • 特点:任务之间按顺序执行,调用方需要等结果返回。
    • 例子:拨通电话,必须等待通话结束,才能继续做其他事情。
  • 异步:描述任务的执行模式,调用者发出任务请求后,不用等待结果即可继续做其他事情。

    • 特点:任务可以并发执行,调用方会通过回调、事件通知或轮询的方式获取结果。
    • 例子:发送电子邮件后,不需要等待对方回复,可以继续其他操作。

1.2 阻塞与非阻塞

  • 阻塞:描述调用方的行为,调用方在发出请求后会被挂起,直到操作完成。

    • 特点:调用方无法继续执行其他任务。
    • 例子:你站着排队买票,必须等待轮到你时才能完成任务。
  • 非阻塞:描述调用方的行为,调用方在发出请求后,可以立即返回,不用等待操作完成。

    • 特点:调用方可以继续执行其他任务,稍后再获取结果或检查状态。
    • 例子:在售票机购票,如果机器忙碌,你可以暂时离开,稍后再试。

总结:不同维度

  • 同步与异步:关注任务的执行顺序。
  • 阻塞与非阻塞:关注调用方是否被挂起。

2. 同步/异步 与 阻塞/非阻塞的组合

当我们将“同步与异步”、“阻塞与非阻塞”两个维度结合起来时,可以得到以下 4 种常见的组合形式:

2.1 同步阻塞

  • 定义:调用者必须等待任务完成(同步),并且在等待期间被挂起(阻塞)。
  • 特点
    • 操作是顺序的,调用方会完全停滞,直到任务完成。
    • 简单易实现,但效率低下,尤其在长时间 I/O 或网络请求时。
  • 适用场景
    • 适合小型程序或对实时性要求高、不需要高并发的场景。
  • 例子
    • 普通的文件读取:
      with open("example.txt", "r") as file:
          data = file.read()  # 阻塞直到文件内容读取完成
      print(data)
      

2.2 同步非阻塞

  • 定义:调用者必须等待任务完成(同步),但不会被挂起(非阻塞)。调用方可以主动轮询任务的状态。
  • 特点
    • 调用方不会被挂起,可以做一些其他操作,但仍需要主动检查任务进度。
    • 实际场景中较少独立使用,因为频繁轮询可能导致性能问题。
  • 适用场景
    • 需要一定程度的并发,但不希望完全依赖异步的场景。
  • 例子
    • 轮询任务状态:
      import time
      
      def check_task():
          time.sleep(5)  # 模拟任务执行时间
          return "Task Complete"
      
      while True:
          result = check_task()
          if result:
              print(result)
              break
          else:
              print("Still waiting...")
      

2.3 异步阻塞

  • 定义:调用者发出任务请求后无需等待任务完成(异步),但完成回调或通知时会被挂起(阻塞)。
  • 特点
    • 异步执行任务,但调用方可能因为数据等待或资源不可用而被阻塞。
    • 在一些异步框架中,当调用 await 等操作时,类似于异步阻塞。
  • 适用场景
    • 某些异步框架中,任务的完成条件无法完全非阻塞时。
  • 例子
    • Python 中的 asyncio
      import asyncio
      
      async def fetch_data():
          print("Start fetching data...")
          await asyncio.sleep(5)  # 模拟异步阻塞
          print("Data fetched!")
          return "Sample Data"
      
      async def main():
          print("Start main task...")
          data = await fetch_data()  # 异步操作,但调用方会被挂起等待数据
          print(data)
      
      asyncio.run(main())
      

2.4 异步非阻塞

  • 定义:调用者发出任务请求后即可继续做其他事情(异步),且不会因资源等待而被挂起(非阻塞)。
  • 特点
    • 真正的异步非阻塞操作允许多个任务并发运行,极大提高程序效率。
    • 这种场景通常需要借助事件驱动或回调机制。
  • 适用场景
    • 高并发、大规模 I/O 或网络请求的场景。
  • 例子
    • JavaScript 的异步操作:
      console.log("Start task...");
      
      setTimeout(() => {
          console.log("Task complete!");
      }, 2000); // 异步非阻塞
      
      console.log("Do other things...");
      

3. 组合关系总结

组合同步阻塞同步非阻塞异步阻塞异步非阻塞
执行顺序顺序执行顺序执行并发执行并发执行
调用方状态挂起等待主动轮询,非挂起任务通知时挂起不挂起
复杂性简单稍复杂较复杂最复杂
效率一般较高
适用场景简单任务少量并发任务异步框架的等待机制场景高并发 I/O 场景

4. 实际应用场景分析

4.1 同步阻塞

  • 使用场景:简单的文件读写操作、单线程程序。
  • 优点:实现简单,逻辑清晰。
  • 缺点:效率低,容易因单个任务的耗时而拖慢整体性能。

4.2 同步非阻塞

  • 使用场景:某些轮询场景,如轮询数据库状态。
  • 优点:允许一定程度上的并发。
  • 缺点:频繁轮询会导致性能问题,不适合高并发场景。

4.3 异步阻塞

  • 使用场景:异步代码中涉及 I/O 或某些耗时操作时。
  • 优点:代码架构更灵活。
  • 缺点:某些情况下仍然会出现挂起等待。

4.4 异步非阻塞

  • 使用场景:高并发的网络服务(如微服务框架)、分布式系统。
  • 优点:高性能,最大限度利用资源。
  • 缺点:实现复杂,不适合简单应用。

5. 总结与建议

  1. 理解场景需求

    • 如果任务简单且不涉及高并发,可以选择同步阻塞;
    • 如果需要一定的并发支持,可以尝试同步非阻塞或异步阻塞;
    • 如果需要处理高并发或大规模 I/O,推荐使用异步非阻塞。
  2. 选择合适的工具和框架

    • Python 的 asyncio、JavaScript 的 Promiseasync/await 等都是实现异步的强大工具。
    • 对于高并发服务器,可以使用 Nginx、Node.js 等支持异步非阻塞的框架。
  3. 权衡复杂性和性能

    • 高性能往往伴随着更高的实现复杂性,根据需求合理权衡。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2270580.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用Xjar给SpringBoot项目jar包加密

1. 新建一个SpringBoot项目 2. 在pom文件添加依赖&#xff0c;github地址&#xff1a;https://github.com/core-lib/xjar <dependencies><!-- 添加 XJar 依赖 --><dependency><groupId>com.github.core-lib</groupId><artifactId>xjar&l…

UNI-APP_i18n国际化引入

官方文档&#xff1a;https://uniapp.dcloud.net.cn/tutorial/i18n.html vue2中使用 1. 新建文件 locale/index.js import en from ./en.json import zhHans from ./zh-Hans.json import zhHant from ./zh-Hant.json const messages {en,zh-Hans: zhHans,zh-Hant: zhHant }…

AI大模型系列之七:Transformer架构讲解

目录 Transformer网络是什么&#xff1f; 输入模块结构&#xff1a; 编码器模块结构&#xff1a; 解码器模块: 输出模块结构&#xff1a; Transformer 具体是如何工作的&#xff1f; Transformer核心思想是什么&#xff1f; Transformer的代码架构 自注意力机制是什么…

【Linux】:多线程(读写锁 自旋锁)

✨ 倘若南方知我意&#xff0c;莫将晚霞落黄昏 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;Linux—登神长阶 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#…

SELECT的使用

目录 1、SQL的查询命令 1.1 SELECT语句 1.2 投影查询 1.3 选择查询 1.4 聚合函数查询 1.5 简单分组查询(GROUP BY) 1.6 内连接查询 1.7 外连接查询 1.8 子查询 1. 无关子查询 2. 相关子查询 带exists的相关子查询&#xff1a; 1.9 集合查询 1. UNION(并) 2. INT…

Vue项目结构推荐(复杂国际化项目与一般项目结构)

Vue项目结构推荐 一、一般项目结构二、复杂国际化项目结构总结/建议 下面结构是基于Vue和TypeScript开发的项目结构下src包下的结构&#xff0c;若只用到vue与js。则去掉typescript部分的包即可。 一、一般项目结构 assets&#xff1a;存放静态资源&#xff0c;如图片、字体、样…

BOC调制信号matlab性能仿真分析,对比功率谱,自相关性以及抗干扰性

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a 3.部分核心程序 &#xff08;完整版代码包含详细中文注释和操作步骤视频&#xff09…

电影院售票 - 策略模式(Strategy Pattern)

策略模式&#xff08;Strategy Pattern&#xff09; 策略模式&#xff08;Strategy Pattern&#xff09;策略模式概述策略模式结构图策略模式主要包含的角色 talk is cheap&#xff0c; show you my code总结 策略模式&#xff08;Strategy Pattern&#xff09; 策略模式&…

重学 Android 自定义 View 系列(十):带指针的渐变环形进度条

前言 该篇文章根据前面 重学 Android 自定义 View 系列(六)&#xff1a;环形进度条 拓展而来。 最终效果如下&#xff1a; 1. 扩展功能 支持进度顺时针或逆时针显示在进度条末尾添加自定义指针图片使用线性渐变为进度条添加颜色效果 2. 关键技术点解析 2.1 进度方向控制的…

【北京迅为】iTOP-4412全能版使用手册-第七十章 Linux内核移植

iTOP-4412全能版采用四核Cortex-A9&#xff0c;主频为1.4GHz-1.6GHz&#xff0c;配备S5M8767 电源管理&#xff0c;集成USB HUB,选用高品质板对板连接器稳定可靠&#xff0c;大厂生产&#xff0c;做工精良。接口一应俱全&#xff0c;开发更简单,搭载全网通4G、支持WIFI、蓝牙、…

CG顶会论文阅读|《科技论文写作》硕士课程报告

文章目录 一、基本信息1.1 论文基本信息1.2 课程基本信息1.3 博文基本信息 二、论文评述&#xff08;中英双语&#xff09;2.1 研究问题&#xff08;Research Problem&#xff09;2.2 创新点&#xff08;Innovation/Contribution&#xff09;2.3 优点&#xff08;Why this pape…

.NET周刊【12月第4期 2024-12-22】

国内文章 dotnet 简单使用 ICU 库进行分词和分行 https://www.cnblogs.com/lindexi/p/18622917 本文将和大家介绍如何使用 ICU 库进行文本的分词和分行。 dotnet 简单聊聊 Skia 里的 SKFontMetrics 的各项属性作用 https://www.cnblogs.com/lindexi/p/18621674 本文将和大…

git 问题解决记录

在用git上传文件到仓库中出现了2个问题 第一个问题&#xff1a; 需要修改git的代理端口与电脑自己的代理服务器设置中的端口和VPN的端口保持一致&#xff0c; 比如我的端口是7897&#xff0c;就设置 git config --global http.proxy http://127.0.0.1:7897 git config --glo…

XML结构快捷转JSON结构API集成指南

XML结构快捷转JSON结构API集成指南 引言 在当今的软件开发世界中&#xff0c;数据交换格式的选择对于系统的互操作性和效率至关重要。JSON&#xff08;JavaScript Object Notation&#xff09;和XML&#xff08;eXtensible Markup Language&#xff09;是两种广泛使用的数据表…

Oracle 创建本地用户,授予权限,创建表并插入数据

目录 一. 用户的种类二. 切换session为PDB三. 创建用户并授予权限四. 创建表空间五. 为用户分配默认表空间并指定表空间配额六. 通过创建的用户进行登录七. 创建脚本&#xff0c;简化登录八. 查看用户信息九. 创建表&#xff0c;并插入数据9.1 查看当前用户的schema9.2 插入数据…

系统设计——大文件传输方案设计

摘要 大文件传输是指通过网络将体积较大的文件从一个位置发送到另一个位置的过程。这些文件可能包括高清视频、大型数据库、复杂的软件安装包等&#xff0c;它们的大小通常超过几百兆字节&#xff08;MB&#xff09;甚至达到几个吉字节&#xff08;GB&#xff09;或更大。大文…

【老白学 Java】简单位移动画

简单位移动画 文章来源&#xff1a;《Head First Java》修炼感悟。 上一篇文章中&#xff0c;老白利用内部类的特性完成了多个事件的处理&#xff0c;感觉还不错。 为了更深入理解内部类&#xff0c;本篇文章继续使用内部类创建一个画板&#xff0c;完成简单的位移动画&#x…

彻底解决 Selenium ChromeDriver 不匹配问题:Selenium ChromeDriver 最新版本下载安装教程

在 Python 的 Selenium 自动化测试中&#xff0c;ChromeDriver 是不可或缺的工具。它作为代码与 Chrome 浏览器的桥梁&#xff0c;但如果版本不匹配&#xff0c;就会导致各种报错&#xff0c;尤其是以下常见问题&#xff1a; selenium.common.exceptions.SessionNotCreatedExc…

[CTF/网络安全] 攻防世界 warmup 解题详析

查看页面源代码&#xff0c;发现source.php 得到一串代码&#xff0c;进行代码审计&#xff1a; <?phpclass emmm{public static function checkFile(&$page){$whitelist ["source">"source.php","hint">"hint.php"];…

基于fMRI数据计算脑脊液(CSF)与全脑BOLD信号的时间耦合分析

一、前言 笔者之前的文章《基于Dpabi和spm12的脑脊液(csf)分割和提取笔记》,介绍了如何从普通的fMRI数据中提取CSF信号。首先是基础的预处理,包括时间层校正、头动校正,再加上0.01-0.1Hz的带通滤波。接着用SPM12分割出CSF区域,设置一个比较严格的0.9阈值,确保提取的真是…