Python 并发编程:threading、asyncio 与多进程,选型不再纠结

Python并发编程实践:asyncio与多进程深度解析 在单核处理器时代,程序性能提升主要依赖时钟频率的提升。但随着摩尔定律逐渐失效(2005年后CPU主频增长停滞),单核性能提升空间收窄至每年约3%。结构化并发:引入类似Trio的nursery概念,确保所有子任务在父任务退出前完成。分布式任务队列:集成Celery与asyncio,支持跨节点任务分发。跨语言互操作:通过PyO3与Rust集成,提升异步任务性能。性能优化:asyncio核心性能提升40%适用场景:GUI事件处理、轻量级IO任务。优势:超高并发密度(可管理10K+任务) 阅读详情

Python 并发编程:threading、asyncio 与多进程,选型不再纠结

cover

一、并发场景下的 Python 困境:GIL 之痛与 IO 瓶颈

Python 的并发编程一直是个让人头疼的话题。GIL(全局解释器锁)的存在,让多线程在 CPU 密集型任务面前几乎无用武之地。但 Python 在 IO 密集型场景下依然有大量并发需求:网络请求、数据库查询、文件读写。选错并发模型,轻则性能上不去,重则死锁、资源泄漏、调试到崩溃。

生产环境里常见的坑:用 threading 写爬虫,线程数一上去就频繁上下文切换,性能反而下降;用 asyncio 改写,结果第三方库不支持协程,到处 run_in_executor,代码比多线程版本还复杂;用 multiprocessing 跑计算任务,进程间通信的开销比计算本身还大。

这些问题的根源不是 Python 的并发模型不好,而是没有根据任务特征选对模型。IO 密集型、CPU 密集型、混合型——每种场景都有最优解,但前提是你得理解底层机制。

二、三种并发模型的运行机制与调度原理

Python 提供了三种主要的并发模型,它们的调度机制完全不同。

graph TD
    A[Python 并发模型] --> B[threading 多线程]
    A --> C[asyncio 协程]
    A --> D[multiprocessing 多进程]

    B --> B1[操作系统调度]
    B1 --> B2[GIL 限制:同一时刻仅一个线程执行 Python 字节码]
    B2 --> B3[IO 操作时释放 GIL]

    C --> C1[事件循环调度]
    C1 --> C2[单线程内协作式切换]
    C2 --> C3[await 挂起协程,无锁竞争]

    D --> D1[操作系统进程调度]
    D1 --> D2[每个进程独立 GIL]
    D2 --> D3[真正并行,但进程间通信开销大]

threading 的调度由操作系统内核完成,线程切换是抢占式的。但在 CPython 中,GIL 保证同一时刻只有一个线程执行 Python 字节码。这意味着多线程无法利用多核进行 CPU 计算,但在 IO 等待时 GIL 会被释放,所以 IO 密集型任务仍能受益。

asyncio 的调度由事件循环完成,协程切换是协作式的。await 关键字标记了协程的挂起点,事件循环在此时切换到其他就绪的协程。整个过程在单线程内完成,没有锁竞争,没有上下文切换开销。代价是必须全程使用异步 API,一旦混用阻塞调用,整个事件循环都会卡住。

multiprocessing 通过创建独立进程来绕过 GIL,每个进程有自己的 GIL 和内存空间。这是 Python 中唯一能实现真正 CPU 并行的方式。但进程创建和 IPC(进程间通信)的开销很大,数据需要序列化传输,不适合高频小任务的场景。

三、生产级并发代码:三种模型的实战实现

threading:IO 密集型任务池

import threading
import queue
import requests
from typing import List, Optional

class ThreadedFetcher:
    """基于线程池的并发 HTTP 请求器"""

    def __init__(self, worker_count: int = 8):
        self.worker_count = worker_count
        self.task_queue: queue.Queue = queue.Queue()
        self.results: dict[str, Optional[str]] = {}
        self.errors: dict[str, str] = {}
        self._lock = threading.Lock()

    def fetch_all(self, urls: List[str]) -> dict[str, Optional[str]]:
        """并发请求多个 URL,返回 {url: 响应文本} 映射"""
        # 将所有 URL 放入任务队列
        for url in urls:
            self.task_queue.put(url)

        # 创建并启动工作线程
        workers = []
        for _ in range(self.worker_count):
            t = threading.Thread(target=self._worker, daemon=True)
            t.start()
            workers.append(t)

        # 等待所有任务完成
        self.task_queue.join()
        return self.results

    def _worker(self):
        """工作线程:从队列取 URL 并发起请求"""
        while True:
            try:
                url = self.task_queue.get_nowait()
            except queue.Empty:
                break

            try:
                resp = requests.get(url, timeout=10)
                resp.raise_for_status()
                with self._lock:
                    self.results[url] = resp.text
            except requests.RequestException as e:
                with self._lock:
                    self.errors[url] = str(e)
                    self.results[url] = None
            finally:
                self.task_queue.task_done()

asyncio:高并发 HTTP 请求

import asyncio
import aiohttp

async def fetch_batch(urls: list[str], concurrency: int = 20) -> dict[str, str | None]:
    """使用 asyncio 并发请求多个 URL,通过信号量控制并发数"""
    results: dict[str, str | None] = {}
    semaphore = asyncio.Semaphore(concurrency)

    async def fetch_one(session: aiohttp.ClientSession, url: str):
        async with semaphore:
            try:
                async with session.get(url, timeout=aiohttp.ClientTimeout(total=10)) as resp:
                    resp.raise_for_status()
                    results[url] = await resp.text()
            except (aiohttp.ClientError, asyncio.TimeoutError) as e:
                results[url] = None
                print(f"请求失败 [{url}]: {e}")

    async with aiohttp.ClientSession() as session:
        tasks = [fetch_one(session, url) for url in urls]
        await asyncio.gather(*tasks)

    return results

multiprocessing:CPU 密集型并行计算

import multiprocessing as mp
from functools import partial

def process_chunk(chunk: list[int], threshold: int) -> list[int]:
    """对数据块执行 CPU 密集型计算,筛选满足阈值的数据"""
    return [x for x in chunk if _heavy_computation(x) > threshold]

def _heavy_computation(n: int) -> float:
    """模拟耗时的计算逻辑"""
    result = 0.0
    for i in range(1000):
        result += (n ** 0.5) * i / (i + 1)
    return result

def parallel_filter(data: list[int], threshold: int, workers: int = 4) -> list[int]:
    """将数据分块,多进程并行计算"""
    chunk_size = len(data) // workers
    chunks = [
        data[i * chunk_size : (i + 1) * chunk_size]
        for i in range(workers)
    ]

    # 使用进程池并行处理
    func = partial(process_chunk, threshold=threshold)
    with mp.Pool(processes=workers) as pool:
        chunk_results = pool.map(func, chunks)

    # 合并结果
    return [item for chunk in chunk_results for item in chunk]

四、三种模型的适用边界与性能权衡

threading 适合:IO 密集型任务,且需要兼容同步第三方库。比如用 requests 做爬虫、用 psycopg2 查数据库。线程数建议控制在 CPU 核心数的 2-5 倍,过多会导致上下文切换开销超过 IO 等待的收益。

asyncio 适合:高并发 IO 场景,并发连接数在百级以上。比如 WebSocket 服务、大量 HTTP 请求。优势是单线程无锁,劣势是生态要求高——所有 IO 操作都必须用异步库。混用阻塞调用是 asyncio 最大的坑,一行 time.sleep() 就能让整个事件循环卡死。

multiprocessing 适合:CPU 密集型计算,数据量足够大以至于能摊平进程创建和 IPC 的开销。注意避免在进程间传递大对象,序列化/反序列化的成本可能比计算本身还高。共享状态尽量用 multiprocessing.Value 或 Manager,而不是文件或数据库。

一个常被忽略的取舍:调试难度。多线程的竞态条件难以复现,asyncio 的协程栈追踪不如同步代码直观,多进程的调试需要附加到子进程。生产环境中,可观测性比性能更重要——如果出问题查不到原因,再快的并发也没用。

五、总结

Python 三种并发模型各有适用场景:threading 适合 IO 密集且需要兼容同步库的场景,asyncio 适合高并发纯异步 IO 场景,multiprocessing 适合 CPU 密集型并行计算。选型的核心依据是任务类型(IO 还是 CPU)和生态约束(同步库还是异步库)。混合场景下,可以用 asyncio 做主调度,CPU 任务通过 run_in_executor 委托给进程池。并发编程没有银弹,理解调度机制才能做出正确的权衡。

Python并发编程的终极指南:深入理解asyncio与多线程/多进程的比较 为了应对大量并发请求,Python提供了多种并发编程的方式,包括异步编程、多线程和多进程。本文将深入探讨Python中的异步编程模型(使用asyncio)与传统的多线程和多进程模型的异同,以及如何选择合适的并发编程方式来满足实际需求。通过本文的介绍,相信您已经深入理解了Python中的异步编程模型(使用asyncio)与传统的多线程和多进程模型的异同,并了解了如何选择合适的并发编程方式来满足实际需求。多进程是一种并发编程模型,它通过创建多个进程来实现并发执行。下面是一个简单的多进程编程示例,使用。 阅读详情

相关推荐

Python并发编程:多线程、多进程与asyncio对比

并发编程是现代软件开发的核心技术之一,它通过任务分解和并行执行显著提升程序性能。Python提供了多线程、多进程和asyncio三种主流并发方案,各有其独特的实现原理和适用场景。多线程适合I/O密集型任务但受GIL限制,多进程能充分利用多核CPU但资源消耗较大,而asyncio则在单线程下实现超高并发I/O处理。理解这些方案的底层机制和性能特征,对于构建高性能Python应用至关重要。特别是在处理网络请求、数据分析和微服务等场景时,合理的并发模型选择往往能带来数量级的性能提升。本文通过详细的基准测试,揭示了

weixin_34126557的博客 329

python并发编程:协程asyncio、多线程threading、多进程multiprocessing

python中的asyncioTask对象 Task对象 tasks用于并发调度协程,通过asyncio.creat_task(协程对象)的方式可以创建Task对象,这样可以让协程加入事件循环中等待被调度执行。除了使用asyncio.creat_task()以外,还可以用低层级的loop.creat_task()或asyncio.ensure_future()。 注意:asyncio.creat_task()在python3.7之后加入。在python3.7之前可以改用低层级的asyncio.ensure_

Xzike的博客 7543

Python学习:并发编程之Asyncio

在Python学习:Python并发编程之Futures学习了 Python 并发编程的一种实现——多线程。本博客继续学习 Python 并发编程的另一种实现方式——Asyncio。 在处理 I/O 操作时,使用多线程与普通的单线程相比,效率得到了极大的提高。多线程有诸多优点且应用广泛,但也存在一定的局限性: 比如,多线程运行过程容易被打断,因此有可能出现 race condition 的情况; 再如,线程切换本身存在一定的损耗,线程数不能无限增加,因此,如果 I/O 操作非常 heavy,多线程很有可能

小朱小朱绝不认输的博客 2282

Python 并发编程:asyncio vs threading vs multiprocessing

Python 提供了三种主要的并发编程模型:asyncio、threading 和 multiprocessing。asyncio:单线程协程,适合 I/O 密集型任务,内存开销小,性能优异threading:多线程并发,适合 I/O 密集型任务,编程模型简单,但受 GIL 限制:多进程并行,适合 CPU 密集型任务,无 GIL 限制,但内存开销大在实际应用中,应根据任务类型、性能要求和代码复杂度选择合适的并发模型。对于复杂系统,也可以结合使用多种并发模型,充分发挥各自的优势。技术演进的内在逻辑。

lady_mumu的博客 4439

解密 Python 并发编程:Threading, Multiprocessing 与 Asyncio 深度对比

本文深入对比了Python三大并发编程工具:Threading、Multiprocessing和Asyncio。Threading适合I/O密集型任务但受GIL限制;Multiprocessing能真正并行处理CPU密集型任务但资源消耗大;Asyncio专为高效I/O设计但学习曲线较陡。文章通过代码示例、对比表格和实战场景分析,帮助开发者根据任务类型(计算密集/I/O密集)选择合适工具,并讨论了各自的优缺点及适用场景。最后邀请读者分享并发编程经验和应对GIL限制的见解。

铭渊老黄 381

高通AI Engine SDK(QNN)使用教程(环境配置、模型转换、量化、推理、分析)

高通AI Engine使用教程

weixin_51031772的博客 1万+

python并发编程multiprocessing、threading、asyncio

多线程并发 threading模块,利用CPU和IO可同时执行的原理,让CPU在IO执行时执行**(多线程)** 多CPU并行 multiprocessing模块,利用多核CPU的能力,实现并行执行任务**(多进程)** 多机器并行 hadoop/hive/spark asyncio模块,在单线程利用CPU和IO同时执行的原理,实现函数异步执行**(异步IO*)** 使用Lock对资源加锁,防止冲突访问 使用Queue实现不同线程/进程之间的数据通信,实现生产者-消费者模式 使用线程池Pool/进程池Poo

SXxtyz的博客 1732

5分钟搞定PettingZoo多智能体环境搭建:从安装到运行第一个Demo

本文详细介绍了如何在5分钟内完成PettingZoo多智能体环境的搭建,从安装到运行第一个Demo。通过精准的版本控制和常见问题解决方案,帮助开发者快速上手多智能体强化学习(MARL)环境配置,并提供了实战案例和性能优化技巧。

backprop5master的博客 221

Python 并发编程入门:Threading vs Asyncio 全面解析

Asyncio 是 Python 3.4 引入的标准库,基于协程(Coroutine)实现异步编程,适合大量 I/O 任务。并发编程提升程序性能,选择适合的方案尤为关键。Threading 和 Asyncio 各有优劣,理解底层原理才能灵活应用。

2501_92823525的博客 964

微信小程序 实现拼图功能

微信小程序 实现碎片拼图

weixin_45689786的博客 2250

【无标题】

可以看到这是一个带过滤的rce,并且还需要绕过空格,通过·查询资料得到了${IFS},$IFS$9,<,$IFS。然后f,l,a,g都被过滤了,可以用中括号[]来进行正则匹配,把GET传的参数改为?cmd=uniq /[e-h][k-n][^-b][e-h],就得到了flag。cmd={%0A"cmd":"/bin/cat /home/rceservice/flag"%0A}可以看到l被过滤了ls用不了了可以用dir用GET传参cmd=dir /,POST传参shell=system。

2501_94507425的博客 303

python后台——asyncio,多进程+asyncio

今天我们来学习下异步io的服务器处理。

2万+

YOLO26改进策略【卷积层】| CVPR 2025 频率动态卷积 FDConv 频域分权重提多样性 + 双调制降冗余,增强特征表征能力

本文记录的是利用FDConv 算子改进 YOLOv11 的卷积层特征提取层。(Frequency Dynamic Convolution)通过傅里叶域权重划分与空间-频率双调制机制结合,实现YOLOv11特征提取中频率多样化的动态卷积与空间自适应的频带调制。本文利用算子,通过傅里叶不相交权重生成频率差异化的并行卷积核以丰富特征表达,再通过核空间调制和频带调制结合局部-全局信息、适配图像空间异构性,同时依托固定参数预算实现轻量化设计,对YOLOv11中目标的低频语义特征与高频细节/边界特征进行针对性增强、抑制

Limiiiing的博客 476

Python 并发编程:subprocess、threading、multiprocessing、asyncio 与 concurrent.futures 全解析

​​:系统级交互的桥梁​​:轻量级 I/O 并发​​:CPU 密集任务的破局者​​asyncio​​:高并发 I/O 的终极方案​​:抽象层的效率优化理解它们的本质差异,结合具体业务场景灵活组合,才能构建出高效、稳定的并发系统。

小虾米 902

基于YOLOv8的智能肿瘤检测系统:从图像到诊断的深度学习应用——含代码和论文

本文提出了一种基于YOLOv8深度学习的智能肿瘤检测系统,用于医学影像(CT/MRI/X光)的自动分析与诊断。针对传统人工阅片效率低、主观性强的问题,系统采用最新的YOLOv8目标检测算法,通过改进的C2F骨干网络、Anchor-Free检测头和解耦头等创新设计,实现高效精准的肿瘤定位。文章详细阐述了模型架构、数据处理流程、训练优化方法及PyQt5用户界面开发,为临床提供可靠的AI辅助诊断工具。实验结果表明,该系统在速度和准确率上达到良好平衡,有望提升肿瘤早期筛查效率。

FJN110的博客 199

Chrome更新出现错误代码3: 0X80070422 -- system level的解决方案

本文主要介绍了Chrome更新出现错误代码3: 0X80070422 – system level的解决方案,希望能对使用Chrome的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 1万+

Python 并发编程三大利器:asyncio、aiohttp 与 threading 深度解析

Python并发编程工具对比:asyncio、aiohttp与threading 本文深入解析Python三大并发工具的核心特性和适用场景。threading模块适合I/O密集型任务,编程简单但受GIL限制;asyncio通过协程实现高效并发,适合处理大量连接;aiohttp是基于asyncio的高性能HTTP客户端,专为异步网络请求优化。三者各具优势:threading适合简单并发需求,asyncio处理复杂异步系统,aiohttp专注HTTP通信。开发者应根据任务类型(CPU/IO密集型)、性能要求和编

2402_85519509的博客 1786

[cshell]个性化配置你的cshrc/tcshrc

本文介绍了csh/tcsh shell的配置优化方法,主要包括:1. 配置文件管理(全局和个人配置);2. 按键绑定设置(解决远程登录按键问题);3. 提示符个性化(包含颜色配置方案);4. 环境变量设置(如LSCOLORS、CLICOLOR等);5. 安全防护措施(防误删、防覆盖等);6. 实用alias命令集(简化操作、提高效率)。文章提供了详细的配置示例,并建议通过man tcsh获取更多帮助信息。这些配置能显著提升shell使用体验和工作效率。

元直的博客 6113

Python 并发模型对比:从 threading 到 asyncio 到多进程的性能边界

Python 并发选型的本质是在"GIL 限制"和"任务特征"之间找到匹配方案。本文的核心结论:纯 I/O 密集选 asyncio(高并发、低开销),I/O + CPU 混合选 asyncio + 进程池,纯 CPU 密集选 multiprocessing。落地时需重点关注三个参数:线程/协程并发度(I/O 建议不超过 1000)、进程池大小(建议等于 CPU 核心数)、任务超时时间(建议 30 秒)。建议通过性能基准测试量化不同模型的实际吞吐和延迟,而非依赖经验判断。

lady_mumu的博客 3093

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Python 并发编程:asyncio vs threading vs multiprocessing 深度对比

在100个I/O密集型任务中,asyncio的执行时间为1.2秒,比threading快33%,比multiprocessing快43%;在100个CPU密集型任务中,multiprocessing的执行时间为2.2秒,比同步执行快74%,比threading快73%。随着硬件的发展和异步生态的成熟,asyncio在I/O密集型场景中的优势将更加明显,而multiprocessing在CPU密集型场景中仍将保持其价值。:基于操作系统的进程实现,每个进程有独立的内存空间。

lady_mumu的博客 4328

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Python并发编程:原理与实践

并发编程是现代软件开发中的重要概念,它允许程序同时执行多个任务,提高系统的响应速度和资源利用率。Python提供了多种并发编程的方式,如多线程、多进程和异步编程。本文将深入探讨Python并发编程的核心原理和实践应用,帮助读者掌握这一重要的编程技能。

lady_mumu的博客 2357

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Python 并发编程:多线程、多进程、协程(asyncio)对比与选型 —— 一个老炮儿的实战心得

本文对比了Python中三种并发编程模型(多进程、多线程、协程)的特点与适用场景。多进程适合CPU密集型任务,能绕过GIL限制;多线程适合I/O密集型任务,如数据库查询;协程(asyncio)则是高并发I/O应用的未来,但依赖异步生态。文章通过电科金仓KES数据库的实际案例,展示了多线程和协程在数据库查询中的运用,并给出选型建议:CPU密集型选多进程,I/O密集型优先考虑多线程,超高并发I/O且有异步支持时选择协程。

Cangjie2018的博客 1112

Python 并发编程(三)对比(multiprocessing, threading, concurrent.futures, asyncio)

1. 对比 Python 3.2 引入了concurrent.futures。 3.4版本引入了asyncio到标准库, python3.5以后使用async/await语法。 库 Class/Method 并发类型 适用任务 multiprocessing Pool 并行 cpu 密集型 concurrent.futures ProcessPoolExecutor 并行 cpu 密集型 threading Thread 并

be5yond的博客 9156

Python并发编程实战:多线程、多进程与Asyncio性能优化指南

并发编程是现代软件开发的核心技术,通过同时执行多个任务显著提升程序性能。Python通过多线程、多进程和异步编程三种范式实现并发,但受限于全局解释器锁(GIL)的特性。多线程适合I/O密集型场景,利用ThreadPoolExecutor可避免资源耗尽;多进程能突破GIL限制,适合CPU密集型计算;而asyncio通过事件循环在单线程内实现高效I/O并发。理解线程安全、进程通信和任务分块等关键技术,能帮助开发者在网络爬虫、数据处理等场景实现最优性能。本文通过实战案例揭示如何根据任务特性选择并发方案,并分享性能

cuankuangzhong6373的博客 456

Python 并发编程深度实战 2026 版:从 threading 到 asyncio 的完整攻防指南

本文是《Python 高级应用系列》的第2篇,深入探讨 Python 并发编程。文章首先区分并发(Concurrency)、并行(Parallelism)和异步(Async)的概念,分析 GIL 对 Python 多线程的影响,并提供任务类型选择决策树。核心内容涵盖传统多线程编程(threading),包括线程创建与生命周期管理、线程同步机制(Lock、RLock、Semaphore)以及线程间通信(Queue、Event)。文章通过丰富代码示例演示线程安全操作、可重入锁应用、并发数控制等实战场景,帮助开发

热爱技术与前沿创新,深耕科技领域,在科创中精进自我;探索技术乐趣,分享技术干货与成长心得,以技术为伴,热爱生活,在科创与生活中双向成长。 348

Python中的并发编程:多线程与多进程的高级应用

多线程是指在同一进程中运行多个线程,每个线程执行不同的任务,共享相同的内存空间。Python中的多线程通过threading模块实现,使用起来比较简单。# 创建线程# 启动线程# 等待线程结束多进程是指在操作系统中同时运行多个进程,每个进程拥有独立的内存空间和资源。Python中的多进程通过模块实现,可以利用多核处理器的优势。# 创建进程# 启动进程# 等待进程结束。

Trb601012的博客 1327
上一篇: Rust AI 生态扫描:从 tract 到 candle,本地推理库该怎么选?
下一篇: WASM + AI:浏览器端推理的架构设计与落地实践
第一程序员
博客等级 码龄1年 1万+粉丝 1807原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值