首页/新闻资讯/正文详情

35-并发模型对比(下)-决策树与Django项目中的并发选型实践

发布时间:2026/9/25 18:34:23 来源:云帆数科 栏目:资讯中心
35-并发模型对比(下)-决策树与Django项目中的并发选型实践
文章目录多线程、多进程、协程——决策树与 Django 项目中的并发选型实践下导入语1 ~ 终极决策树2 ~ Django 并发选型问题一Celery Worker 用多进程还是协程2.1 默认是 prefork多进程2.2 换成 gevent协程池2.3 什么时候用 prefork vs gevent3 ~ Django 并发选型问题二Gunicorn Worker 类型3.1 真实经历4 ~ Django 并发选型问题三异步 View vs 同步 View思考 总结结尾多线程、多进程、协程——决策树与 Django 项目中的并发选型实践下文章简介上篇用三组 benchmark 实测了多线程、多进程、协程的纯 IO / 纯 CPU / 混合负载性能。下篇基于这些数据给出一张可直接使用的决策树——拿到需求先判断瓶颈类型IO or CPU再看数据共享需求最后选模型。深入 Django 项目中的实际选型Celery 任务用多进程还是协程Django View 本身需要并发吗Gunicorn 的 worker 类型sync / gevent / gthread怎么选每个问题都对应一个真实的 Django 优化经历——从 celery worker 从 4 进程改成 gevent 协程池后内存从 2GB 降到 400MB。 个人主页源码骑士❄专栏传送门《Android开发基础》《python基础课程》⭐️热衷从源码视角拆解技术底层原理将复杂架构讲得通俗易懂 源码骑士的简介5年Android Framework系统开发经验曾主导多项系统级性能优化专项技术栈覆盖Android系统全链路Binder/Handler/AMS/WMS/启动流程及Java后端全家桶Spring MyBatis Redis Oracle累计产出原创技术文章100篇文章以源码拆解为特色被读者评价为看一篇胜过啃一周文档导入语上篇的三组 benchmark 给了数据下篇直接给决策树。另外把 Django 项目中和并发模型选择紧密结合的几个实际问题拆开——Celery、Gunicorn worker、异步 View——每选错一次就是一次生产事故。1 ~ 终极决策树拿到性能需求 │ ├─ 到底是慢在哪里先做基准测试 │ │ 别猜——用 cProfile / Debug Toolbar 跑一次再说 │ │ │ ├─ IO 密集型网络 / 磁盘 / 数据库查询占绝大部分 │ │ ├─ 需要和现有同步库Django ORM、requests互操作 │ │ │ └─ → 多线程 ThreadPoolExecutor ✅ │ │ │ │ │ ├─ 全链路可从零用异步库写aiohttp、asyncpg、httpx │ │ │ ├─ 并发量500→ 多线程也可以 │ │ │ └─ 并发量1000→ 协程 asyncio ✅ │ │ │ │ │ └─ 数据量大且不能共享内存 → 多进程 Queue │ │ │ ├─ CPU 密集型纯计算图像处理、数值运算、正则大匹配 │ │ ├─ 计算简单且数据量小 → 多进程池 ProcessPoolExecutor ✅ │ │ ├─ 库是 NumPy/Numba/Cython → 多线程也可以C 层释放 GIL │ │ └─ 计算极端重量 → 分离任务队列Celery 独立 worker │ │ │ └─ 混合负载既有 IO 又有 CPU │ ├─ IO 占比70% → 多线程 ✅ │ ├─ CPU 占比70% → 多进程 ✅ │ └─ IO/CPU 各占一半 → 多线程给 CPU 部分也用线程池2 ~ Django 并发选型问题一Celery Worker 用多进程还是协程2.1 默认是 prefork多进程celery-Amyproject worker--concurrency4# 默认 prefork——4 个独立的进程每个进程有自己的一份内存优点稳定不受 GIL 影响。缺点每个进程加载整个 Django app——4 个进程 4 倍的 Django 初始化内存。2.2 换成 gevent协程池pipinstallgevent celery-Amyproject worker--poolgevent--concurrency500500 个协程共享一个 Django 实例——内存从 2GB 降到 400MB。但要求 Celery 任务本身是 IO 密集型的——如果是 CPU 计算gevent 不会有性能收益。2.3 什么时候用 prefork vs gevent任务类型推荐 pool原因发送邮件、推送通知gevent纯 IO协程最优图片压缩、PDF 生成preforkCPU 密集型协程无收益调用第三方 API大量gevent大量等待协程发挥优势数据库批量写入prefork批量写也可能有 DB 层锁prefork 避免阻塞3 ~ Django 并发选型问题二Gunicorn Worker 类型worker 类型并发模型适合场景sync默认一个 worker 一个请求低并发、CPU 密集型gevent协程——一个 worker 处理成千上万个连接IO 密集型高并发gthread一个 worker 多线程需要和 Django 同步代码互操作的 IO 场景# 高并发 APIIO 型——用 geventgunicorn myproject.wsgi --worker-classgevent--workers4--worker-connections1000# CPU 密集型或对同步性要求严格的——用 syncgunicorn myproject.wsgi--workers43.1 真实经历2022 年把 API 网关从sync换成gevent后单台 2 核 4GB 服务器能承载的并发连接数从 200 提升到 3000。但发现有一个使用了requests同步库的 View 在 gevent 下没有释放控制权——必须换上grequestsgevent 版 requests或给该 View 开单独的路由组。4 ~ Django 并发选型问题三异步 View vs 同步 ViewDjango 3.1 支持异步 View。但 Django ORM 本身不支持异步——await Book.objects.filter()不存在。# ❌ 异步 View 中直接调 ORMasyncdefbook_list(request):booksBook.objects.all()# 同步调用——卡死事件循环returnJsonResponse({books:list(books.values())})# ✅ 用 sync_to_async 包装fromasgiref.syncimportsync_to_asyncasyncdefbook_list(request):booksawaitsync_to_async(list)(Book.objects.all().values())returnJsonResponse({books:books})思考 总结Django 并发选型的三条原则**先确定瓶颈IO/CPU**再选模型。数据驱动——别听别人说多线程没用就放弃多线程。Celery 任务类型决定 worker pool。IO → gevent省内存CPU → prefork稳定。Gunicorn worker class 影响面最大。gevent 提高 IO 并发sync 更稳定——根据业务选。结尾并发模型对比上下篇完结。感谢阅读源码骑士 — 源码级拆解从底层看透技术关注跟博主一起从源码视角深耕底层原理❤️点赞让优质内容被更多人看见⭐收藏核心知识点存好随用随查评论分享你的经验或疑问一起交流一键四连别忘了给博主一键四连️寄语选模型不要听口碑——看实测数据看业务特征。结语决策树放在手边以后拿到并发优化需求就不慌。下篇进入 Redis 实战。一键四连

相关推荐

11305华夏之光永存:黄大年茶思屋榜文113期 第5题 部件大角度低反射率的表面消光处理工程闭环解题文档
11305华夏之光永存:黄大年茶思屋榜文113期 第5题 部件大角度低反射率的表面消光处理工程闭环解题文档

摘要 原题完整复现:研发兼容金属、非金属、塑料全基材的表面消光工艺;在 50\85 反射角、400\700nm 可见光波段,涂层总厚度≤30μm,处理后部件表面反射率<0.05%;解决现有工艺大角度杂散光反射高、适配基材单… · 2026/9/25 16:58:30

深入解析MC9S12NE64 BDMV4调试模块:硬件与固件命令及单线通信协议
深入解析MC9S12NE64 BDMV4调试模块:硬件与固件命令及单线通信协议

1. 项目概述:为什么需要深入理解BDM调试模块在嵌入式开发,尤其是汽车电子和工业控制这类对稳定性和实时性要求极高的领域,调试工具的效率和可靠性直接决定了项目的成败。想象一下,你正在开发一个基于MC9S12NE64的发动机控制器&… · 2026/9/25 18:44:37

【NLP基石解析】前馈网络:从神经元到文本分类的实战推演
【NLP基石解析】前馈网络:从神经元到文本分类的实战推演

1. 前馈网络:从神经元到文本分类的完整推演 前馈网络(Feedforward Network)是深度学习中最基础的架构之一,也是自然语言处理(NLP)领域的基石模型。我第一次接触这个概念是在研究生时期,当时用Py… · 2026/9/22 13:10:37

Lottery 分布式抽奖系统部署实战:Docker 安装 Elasticsearch 与 Kibana 7.6.2
Lottery 分布式抽奖系统部署实战:Docker 安装 Elasticsearch 与 Kibana 7.6.2

文档教程后端 【免费下载链接】CodeGuide :books: 本代码库是作者小傅哥多年从事一线互联网 Java 开发的学习历程技术汇总,旨在为大家提供一个清晰详细的学习教程,侧重点更倾向编写Java核心内容。如果本仓库能为您提供帮助,请给予支持(关注、… · 2026/9/26 1:20:51

RK3576启动链路全解析:从BootROM到根文件系统挂载
RK3576启动链路全解析:从BootROM到根文件系统挂载

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 1:20:45

DeskcommCRM深度解析:从数据模型到坐席工作台落地实践
DeskcommCRM深度解析:从数据模型到坐席工作台落地实践

DeskcommCRM 这个名字,我第一眼看到就想聊几句。自己带团队做过客户管理系统的朋友都知道,市面上叫 CRM 的产品多到数不清,但真正能在办公桌面上天天打开、让销售和客服都愿意用的那套,往往是团队内部反复打磨出来的。DeskcommCRM… · 2026/9/26 1:20:38

矿山监测数据高效处理全流程:BP拟合、PCA压缩、卡尔曼去噪与贝叶斯调参
矿山监测数据高效处理全流程:BP拟合、PCA压缩、卡尔曼去噪与贝叶斯调参

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 1:20:26

QCoder:阿里打造的AI Native IDE重构开发者工作流
QCoder:阿里打造的AI Native IDE重构开发者工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 1:20:26

末世塔防手游《向僵尸开炮》服务端手工搭建完整教程
末世塔防手游《向僵尸开炮》服务端手工搭建完整教程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 1:20:20

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码