Python 多进程、多线程、协程到底选哪个:一张决策图讲清
📅 2026/7/17 9:51:57
👁️ 次浏览
Python 多进程、多线程、协程到底选哪个:一张决策图讲清「这个任务我该用 threading、multiprocessing 还是 asyncio?」这是 Python 后端绕不开的问题。选错了轻则没加速,重则性能不升反降。今天不堆概念,直接从 GIL 讲起,给你一套能落地的决策标准。绕不开的 GILCPython 有个全局解释器锁(GIL):任一时刻只有一个线程在执行 Python 字节码。这决定了一切:CPU 密集任务(算哈希、图像处理、纯计算),多线程根本没用——GIL 让它们轮流跑,还多了切换开销。IO 密集任务(网络请求、读写文件、查数据库),线程等 IO 时会释放 GIL,别的线程能趁机跑,所以多线程有效。先记住这条分界线,后面全靠它做判断。用实验验证:CPU 密集下多线程无用importtimefromthreadingimportThreaddefcpu_task(n):# 纯计算,典型 CPU 密集s0foriinrange(n):si*ireturnsdefrun_threaded():t1Thread(targetcpu_task,args(10_000_000,))t2Thread(targetcpu_task,args(10_000_000,))t1.start();t2.start()t1.join();t2.join()starttime.perf_counter()run_threaded()print(f2 线程:{time.perf_counter()-start:.2f}s)starttime.perf_counter()cpu_task(10_000_000);cpu_task(10_000_000)print(f串行:{time.perf_counter()-start:.2f}s)跑出来两者耗时几乎一样,多线程甚至因为锁竞争略慢。这就是 GIL——CPU 密集别指望 threading。CPU 密集:上多进程多进程每个进程有独立解释器和独立 GIL,能真正跑满多核。frommultiprocessingimportPoolimporttimedefcpu_task(n):s0foriinrange(n):si*ireturnsif__name____main__:# Windows/macOS 必须加这句,否则子进程递归 importstarttime.perf_counter()withPool(processes4)aspool:pool.map(cpu_task,[10_000_000]*4)print(f4 进程:{time.perf_counter()-start:.2f}s)4 核机器上大约能到串行的 1/4 耗时。代价是:进程创建开销大,进程间传数据要序列化(pickle),别拿它处理海量小任务或传大对象。IO 密集:协程比线程更省IO 密集时,多线程可行,但每个线程要占 MB 级栈内存,开几千个就吃不消。协程(asyncio)在单线程内用事件循环调度,一个协程等 IO 时立刻切到另一个,几万并发也就几十 MB。importasyncioimportaiohttpasyncdeffetch(session,url):asyncwithsession.get(url)asresp:returnawaitresp.statusasyncdefmain(urls):asyncwithaiohttp.ClientSession()assession:# gather 并发发起所有请求,而不是一个个等tasks[fetch(session,u)foruinurls]returnawaitasyncio.gather(*tasks)urls[https://httpbin.org/delay/1]*100resultsasyncio.run(main(urls))# 100 个 1 秒请求,总共约 1 秒出头100 个各睡 1 秒的请求,串行要 100 秒,协程 1 秒多就跑完。关键前提:整条链路必须是异步库(aiohttp 而非 requests)。混进一个同步阻塞调用,整个事件循环就被卡死。协程里混了阻塞代码怎么办现实中总有非异步的库(比如某些数据库驱动)。别直接在协程里调用它,用run_in_executor丢到线程池:importasynciodefblocking_io():# 假设这是个只有同步版本的库调用importtime;time.sleep(1)returndoneasyncdefmain():loopasyncio.get_running_loop()# 阻塞调用扔进线程池,不堵事件循环resultawaitloop.run_in_executor(None,blocking_io)print(result)asyncio.run(main())这样事件循环还能继续调度其他协程,不会被同步调用拖死。决策标准不用记概念,照着问自己两个问题:任务是 CPU 密集还是 IO 密集?CPU 密集(计算为主)→multiprocessing,进程数 ≈ CPU 核数。IO 密集(等网络/磁盘为主)→ 往下看第 2 问。IO 密集下,并发量多大、能否全异步?并发几十上百、且有成熟异步库 →asyncio,最省资源。并发不高,或只有同步库、想少改代码 →ThreadPoolExecutor,简单直接。还有个偷懒但有效的组合:主体用 asyncio,遇到 CPU 密集片段用run_in_executor丢进ProcessPoolExecutor,IO 和计算各得其所。小结GIL 是一切选型的前提:它让多线程对 CPU 密集无效,对 IO 密集有效。CPU 密集 → 多进程(真并行,代价是进程开销和序列化)。IO 密集 高并发 全异步链路 → 协程(最省内存)。IO 密集 有同步库 / 并发不高 → 线程池(改动最小)。协程里绝不能出现同步阻塞调用,非用不可就run_in_executor丢线程池。记忆点:CPU 密集用进程,IO 密集用协程,拿不准或想省事就用线程池——一切先看 GIL。
引言
太阳能一体化光源作为分布式光伏照明系统的核心终端设备,其工程选型直接影响系统可靠性、光环境质量与全生命周期成本。近年来,随着光伏组件效率提升、LED光效突破以及智能控制技术普及,一体化光源产品呈现多样化趋势,但工程…
📅 2026/7/17 9:50:57
json_model实战:从复杂JSON结构到优雅Dart模型的设计模式 【免费下载链接】json_model Generate model class from Json file. 一行命令,通过Json文件生成Dart Model类。 项目地址: https://gitcode.com/gh_mirrors/js/json_model
在Dart和Flutte…
📅 2026/7/17 9:50:57
1. Windows安装失败问题解析与解决方案当你在安装Windows系统时遇到"Windows无法完成安装,若要在此计算机上安装,请重新启动安装"的错误提示,这通常意味着安装过程中出现了某些关键问题。作为一名有十年系统维护经验的IT工程师&…
📅 2026/7/17 9:50:57
1. 盘古50K开发板UDP通信问题背景 第一次拿到紫光同创PGL50H开发板时,我像大多数工程师一样,迫不及待地想测试它的网络性能。这块基于Logos系列FPGA的核心板标称支持千兆以太网,硬件规格相当亮眼:采用484球BGA封装,内置…
📅 2026/7/17 10:56:48
📖标题:Remember When It Matters: Proactive Memory Agent for Long-Horizon Agents
🌐来源:arXiv, 2607.08716v1
🛎️文章简介
🔸研究问题:如何解决长程任务中关键决策状态随轨迹增长而失效的…
📅 2026/7/17 10:56:48
1. 当AI开始操作你的电脑:TuriX项目深度解析 最近GitHub上悄然兴起了一个名为TuriX的开源项目,它正在重新定义我们与计算机交互的方式。这个项目本质上是一个基于视觉语言模型(VLM)的智能代理框架,能够像人类一样通过图…
📅 2026/7/17 10:56:48
1. 人类听觉范围与采样定理 在讨论44.1kHz这个特定数字之前,我们需要先理解两个基础概念:人类听觉的频率范围和奈奎斯特采样定理。这两个理论构成了数字音频采样率选择的科学基础。 人类耳朵能感知的声波频率范围大约是20Hz到20kHz。这个范围会随着年龄…
📅 2026/7/17 10:56:48
1. 悟空派H3开发板音乐播放功能初探 作为一名嵌入式开发爱好者,最近拿到了悟空派H3开发板,第一件事就是测试它的多媒体功能。这款售价仅99元的开发板搭载全志H3四核处理器,主频1.2GHz,支持Linux系统运行,官方宣传中特别…
📅 2026/7/17 10:56:48
真的服了,每次遇到deform中geo文件导入错误,我都想直接把电脑砸了。这软件平时看着挺高大上,一到关键时候就掉链子,尤其是那个几何文件导入,简直是个玄学问题。今天必须得好好吐槽一下,顺便给还在坑里挣扎的兄弟们指条明路,别再像我一样浪费时间了。先说说我最近遇到的这…
📅 2026/7/17 10:55:49
1. 为什么选择用DeepSeek V4替换Codex的底座模型去年我在开发一个智能代码补全工具时,发现Codex的默认底座模型在复杂业务逻辑场景下表现不尽如人意。经过多次测试对比,DeepSeek V4在以下几个关键指标上展现出明显优势:代码补全准确率&#x…
📅 2026/7/17 0:00:32
1. VS Code 高效配置基础作为一款轻量级但功能强大的代码编辑器,VS Code 的默认配置已经能满足基本需求,但通过合理调整设置可以大幅提升编码效率。我使用 VS Code 已经有五年多时间,期间尝试过各种配置方案,总结出这套适合大多数…
📅 2026/7/17 0:00:32
在异常检测领域,很多优秀算法最初都是以研究代码的形式发布的。它们能够在固定测试集上复现实验结果,却不一定能被普通用户直接拿来测试自己的图片。尤其是最近很多算法仅提供在固定测试集的测试环境,而gradio的demo演示也不会提供。
对工程应用和在自己的图片上进行测试来…
📅 2026/7/17 0:00:32
豆包openclaw最近圈子里都在聊豆包openclaw,我也没忍住,掏腰包入手了一套。说实话,刚拿到手的时候,心里是打鼓的。毕竟市面上类似的智能硬件太多了,有的吹得天花乱坠,用起来却是一堆bug。为了不让大家的钱打水漂,我连续用了半个月。从开箱到日常高频使用,甚至故意测试它…
📅 2026/7/17 2:37:27
SQLyog 13.3.1 社区版在Windows 10/11上的完整安装与连接指南 对于刚接触MySQL数据库管理的开发者和学生来说,选择一个直观易用的图形化管理工具至关重要。SQLyog作为一款轻量级但功能强大的MySQL GUI工具,能够显著提升数据库操作的效率和体验。本文将详…
📅 2026/7/16 21:45:29
SPEC CPU 2006 跨平台基准测试深度实战:ARM/X86/MIPS 架构配置优化与结果分析方法论在当今多元化的计算架构时代,如何客观评估不同处理器平台的真实性能成为系统工程师和性能优化专家的核心挑战。SPEC CPU 2006 作为业界公认的计算密集型基准测试套件&am…
📅 2026/7/16 14:13:12
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/17 6:11:34
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/16 4:59:31
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/17 2:40:57