news 2026/5/11 10:38:13

异步、并发、多线程、多进程是现代编程中实现“同时处理多个任务”的四种核心概念。

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
异步、并发、多线程、多进程是现代编程中实现“同时处理多个任务”的四种核心概念。

异步、并发、多线程、多进程是现代编程中实现“同时处理多个任务”的四种核心概念。它们经常被混用,但其实目标、机制和适用场景各不相同。下面我们从定义、原理、关系、对比、适用场景五个维度清晰区分。


一、一句话概括(先建立直觉)

概念一句话解释
并发(Concurrency)逻辑上多个任务“同时”推进(可能交替执行)——这是目标
并行(Parallelism)物理上多个任务真正同时执行(需要多核)——是并发的一种实现
多线程(Multithreading)一个进程内创建多个线程,由操作系统调度,可并发或并行。
多进程(Multiprocessing)创建多个独立进程,每个有自己内存空间,天然支持并行(绕过 GIL)。
异步(Asynchronous)单线程内通过事件循环 + 协作式调度实现高效率 I/O 并发。

关键认知

  • 并发是目的,其他都是手段;
  • 异步 ≠ 多线程 ≠ 多进程,它们是不同层级的解决方案

二、详细解析

1.并发(Concurrency)—— “看起来同时做多件事”

  • 本质:一种程序设计能力,让多个任务在重叠的时间段内推进
  • 不要求同一时刻执行,可以快速切换(如单核 CPU 上跑多个程序)。
  • 例子
    • 你一边煮饭(等水开),一边切菜 ——任务交替进行,但整体进度都在推进
  • 实现方式
    • 多线程
    • 多进程
    • 异步 I/O
    • 协程

🔁 并发 ≠ 并行!

  • 并发:关注任务管理(能否高效处理多个任务);
  • 并行:关注执行方式(是否真的同时运行)。

2.多线程(Multithreading)—— “一个厨房多个厨师”

  • 单位线程(Thread)是 CPU 调度的最小单位,属于同一个进程。
  • 特点
    • 共享进程的内存空间(变量、文件句柄等);
    • 线程间通信简单,但需加锁避免竞争(如threading.Lock);
    • 创建/切换开销比进程小。
  • Python 的坑:受GIL(全局解释器锁)限制,同一时刻只有一个线程能执行 Python 字节码
    • CPU 密集型任务无法加速
    • I/O 密集型任务有效(因为 I/O 时会释放 GIL)。

适用场景

  • 网络请求、文件读写、用户界面响应等I/O 密集型任务

3.多进程(Multiprocessing)—— “多个厨房各自做饭”

  • 单位进程(Process)是操作系统资源分配的单位,彼此完全隔离。
  • 特点
    • 每个进程有独立内存空间,无共享数据(需通过 IPC 通信:队列、管道等);
    • 不受 GIL 限制,可真正利用多核 CPU
    • 创建/切换开销大(比线程重)。
  • Python 实现multiprocessing模块。

适用场景

  • 图像处理、科学计算、加密解密等CPU 密集型任务

4.异步(Asynchronous)—— “一个人高效接单”

  • 核心机制单线程 + 事件循环 + 协程(Coroutine)
  • 工作方式
    • 遇到 I/O 操作(如await http.get()),挂起当前任务,立即去处理其他任务;
    • I/O 完成后,事件循环唤醒对应协程继续执行。
  • 关键要求:所有 I/O 操作必须是“可等待”(awaitable)的(如async def函数)。
  • Python 实现async/await+asyncio

优势

  • 极低内存开销(百万级协程 vs 数千线程);
  • 无锁编程(单线程,无竞态条件);
  • 特别适合高并发网络服务(如 Web 服务器、API 聚合)。

适用场景

  • 调用多个外部 API(如你的代码中的 DeepSeek + 讯飞 OCR);
  • 高并发 Web 服务(FastAPI、aiohttp);
  • 数据库连接池操作。

三、四者关系图

text

编辑

┌──────────────┐ │ 并发 │ ←─ 目标:高效处理多任务 └──────┬───────┘ │ ┌──────────────────┼──────────────────┐ ▼ ▼ ▼ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │ 多线程 │ │ 多进程 │ │ 异步 │ │ (共享内存, OS调度)│ │ (独立内存, 绕过GIL)│ │ (单线程, 事件循环) │ └───────────────┘ └───────────────┘ └───────────────┘ │ │ │ ├─ I/O 密集型 ✅ ├─ CPU 密集型 ✅ ├─ I/O 密集型 ✅✅✅ └─ CPU 密集型 ❌ └─ I/O 密集型 ⚠️ └─ CPU 密集型 ❌

💡 在 Python 中:

  • I/O 密集型:优先选异步,其次多线程;
  • CPU 密集型:必须用多进程

四、对比表格(Python 视角)

特性异步 (asyncio)多线程 (threading)多进程 (multiprocessing)
执行单位协程(Coroutine)线程(Thread)进程(Process)
内存共享单线程,自然共享共享进程内存(需加锁)不共享(需 IPC 通信)
GIL 影响有(CPU 任务无法并行)
能否利用多核❌(单线程)⚠️(仅 I/O 时有效)
资源开销极低(KB 级)中等(MB 级栈空间)高(完整进程复制)
编程复杂度需全链路 async 改造需处理线程安全需处理进程通信
典型用途Web 服务、API 聚合简单 I/O 并发科学计算、图像处理

五、回到你的代码:为什么选择“异步”?

你的程序主要做:

  • 调用API(网络 I/O)

✅ 全是I/O 密集型、无 CPU 计算、无共享状态

因此:

  • 异步是最优解:单线程内并发等待多个 API,资源省、速度快、代码清晰
  • 多线程也可行,但线程切换开销更大;
  • 多进程完全没必要(反而增加 IPC 开销)。

六、总结口诀

  • 并发是目标,手段有三种
    • 异步:单线程玩转高并发(I/O 场景王者);
    • 多线程:轻量并发,小心 GIL 和锁;
    • 多进程:重武器,专治 CPU 密集型。
  • Python 选型口诀
    I/O 用异步,CPU 用多进程,简单并发可线程
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/2 7:37:23

Unpaywall浏览器扩展:学术资源获取的革命性解决方案

Unpaywall浏览器扩展:学术资源获取的革命性解决方案 【免费下载链接】unpaywall-extension Firefox/Chrome extension that gives you a link to a free PDF when you view scholarly articles 项目地址: https://gitcode.com/gh_mirrors/un/unpaywall-extension …

作者头像 李华
网站建设 2026/5/10 22:05:33

解决lombok的@Data注解无法打印继承的父类信息问题

https://www.jb51.net/program/330116r71.htm 问题场景 子类StudentResp继承父类PersonResp,子类也拥有了父类的属性。 给子类中继承的父类属性的赋值,但是打印了以后只会显示子类信息,父类信息不显示。 子类:学生类继承父类人…

作者头像 李华
网站建设 2026/5/10 22:10:42

简单快速实现工业质检:Ultralytics灰度检测终极方案

简单快速实现工业质检:Ultralytics灰度检测终极方案 【免费下载链接】ultralytics ultralytics - 提供 YOLOv8 模型,用于目标检测、图像分割、姿态估计和图像分类,适合机器学习和计算机视觉领域的开发者。 项目地址: https://gitcode.com/G…

作者头像 李华
网站建设 2026/5/9 22:44:32

智能测试的团队能力评估:迈向高效与自动化的关键

随着人工智能和机器学习技术的快速发展,软件测试领域正经历一场深刻的智能化变革。智能测试不仅提升了测试效率,还通过自动化脚本、预测性分析和自适应学习,改变了传统的测试模式。然而,这种变革对测试团队的能力提出了新的挑战&a…

作者头像 李华
网站建设 2026/5/10 14:22:18

企业微信会话存档终极指南:5步高效实现合规数据管理

企业微信会话存档终极指南:5步高效实现合规数据管理 【免费下载链接】WeWorkFinanceSDK 企业微信会话存档SDK(基于企业微信C版官方SDK封装) 项目地址: https://gitcode.com/gh_mirrors/we/WeWorkFinanceSDK 企业微信会话存档作为企业合…

作者头像 李华
网站建设 2026/5/5 13:06:08

Day 38

# DAY 38 Dataset 和 Dataloader 类知识点回顾: 1. Dataset 类的__getitem__和__len__方法(本质是 python 的特殊方法) 2. Dataloader 类 3. minist 手写数据集的了解 作业:了解下 cifar 数据集,尝试获取其中一张图片 # 1. 导…

作者头像 李华