恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

asyncio 中的 CPU 密集型任务:正确使用 run_in_executor

  • 首页
  • 资讯中心
  • /
  • asyncio 中的 CPU 密集型任务:正确使用 run_in_executor

相关资讯

向量索引是个小区地图:HNSW 跳表式找房记 2026/9/4 20:38:42
数据库如何保证数据不出错?事务、日志与并发控制全解析 2026/9/4 20:38:42
STM32F103裸机实现USB CDC ACM协议栈 2026/9/4 20:38:42

最新资讯

Roblox 创作者生态入门:从环境配置到开发者分成与内容创作
世嘉DC索尼克乱入《刺猬索尼克3》:经典ROM Hack全解析
DC-3启示录:老系统如何成为运维界的“耐活王”
基于结构特征的跨模态图像配准:MATLAB实现红外与可见光图像对齐
从《刺猬索尼克3》DC版改版看ROM Hack逆向工程的技术价值
零代码、纯聊天,我把阶跃AI调教成了全能英语助手

今日推荐

爬虫防护实操:出海网站拦截恶意采集、垃圾爬虫、无效刷量,CDN 精准防护落地指南
STM32H743 SPI从机DMA双缓冲通信实战
CPU开盖降温教程:20元成本让温度直降30度的原理与实践

本周热门

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析
数字电路时序基石:深入理解建立时间与保持时间
蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

本月精选

自研推理加速器Redwood:两周内实现PyTorch模型高效部署的实战教程
V4L2摄像头采集实战:从camera_client.rar到出图全流程解析
从“谁发明了钢琴键”到知识问答智能体:RAG与记忆工程实践

asyncio 中的 CPU 密集型任务:正确使用 run_in_executor

发布时间:2026/9/4 20:38:42
asyncio 中的 CPU 密集型任务:正确使用 run_in_executor asyncio 中的 CPU 密集型任务正确使用 run_in_executor在 Python 异步开发asyncio中最常见也最致命的架构事故之一就是在协程主链路中直接执行耗时的 CPU 密集型代码。很多团队在使用 FastAPI 开发 AI 网关或 RAG 预处理服务时常常写出类似这样的代码app.post(/process_doc) async def process_document(payload: DocPayload): # 错误示范在主事件循环中直接进行复杂的文本分词、大正则清洗与签名计算 cleaned_text clean_large_text_regex(payload.raw_text) # 耗时 80ms tokens heavy_jieba_tokenize(cleaned_text) # 耗时 120ms signature calculate_sha256_tree(tokens) # 耗时 50ms # 异步向量检索 results await vector_client.search(...) return results这段代码在本地单并发调试时没有任何问题但在生产压测时只要几十个请求同时打进来整个服务的所有接口包括健康检查/healthz、WebSocket 心跳和普通异步查询全部陷入长达数秒的假死卡顿为什么会出现这种情况在 Python 单线程事件循环模型下如何正确使用loop.run_in_executor将 CPU 密集型计算优雅剥离根因GIL 与单线程事件循环的物理机制单线程事件循环asyncio的事件循环Event Loop自始至终只有一个主线程在执行字节码。协程之所以能并发依赖的是在await网络 I/O 时主动让出 CPU 执行权。CPU 计算不会主动让出大正则匹配、长文本的分词Jieba、JSON 巨型对象解析、密码哈希计算等纯 CPU 计算在执行期间绝不会触发任何 await 调度点。当主线程在执行那 250ms 的 CPU 计算时事件循环被彻底霸占操作系统的epoll无法被轮询其他几百个协程只能在内存队列里排队干等。run_in_executor两种执行池的选型博弈Python 提供了loop.run_in_executor(executor, func, *args)来将同步函数派发到外部执行池中运行。关键问题在于第一个参数executor到底传None默认 ThreadPoolExecutor、自定义线程池还是进程池ProcessPoolExecutor------------------------------- | asyncio Event Loop (主线程) | ------------------------------ | loop.run_in_executor(executor, task) | ------------------------------------------------ | | v v [ ThreadPoolExecutor ] [ ProcessPoolExecutor ] - 受 GIL 限制 - 独立 Python 进程绕过 GIL - 共享进程内存 (零数据拷贝) - 多核 CPU 真并行计算 - 适合: 旧版同步 I/O、轻量级 CPU 任务 - 进程间需 pickle 序列化 (有开销) (如同步 DB 驱动、写磁盘文件) - 适合: 重型分词、图像处理、复杂矩阵1. 传 ThreadPoolExecutor 的局限与适用场景局限受制于 GIL由于 Python 的全局解释器锁GIL多个线程在执行纯 Python 字节码时依然是互斥交替跑的。如果启动 8 个线程并发跑纯 Python 的大正则CPU 总利用率依然只能卡在 100%单核且多线程频繁抢 GIL 会带来额外的上下文切换损耗。适用场景包装旧版同步阻塞 I/O如time.sleep、同步 MySQL/Postgres 驱动、读写本地磁盘文件调用已经释放了 GIL 的 C/C 底层扩展库如 Numpy 矩阵运算、OpenCV 图像变换、Cython 模块、PyTorch 推理。2. 传 ProcessPoolExecutor 的真并行威力优势真多核并行它在操作系统层面拉起多个独立的子进程每个子进程拥有独立的 Python 解释器和独立 GIL能够 100% 吃满服务器的 16 核或 32 核 CPU代价IPC 进程间序列化参数和返回值必须支持pickle序列化且在进程间传递巨型数据如 100MB 文本会产生数据拷贝开销。生产级最佳实践代码import asyncio from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor import re import jieba # 1. 进程级常驻进程池避免在每次请求中重复创建销毁进程池开销极大 # 进程数通常设为 CPU 物理核心数 process_pool ProcessPoolExecutor(max_workers8) # 2. 纯 CPU 密集型顶层函数必须定义在模块顶层以支持 pickle 序列化 def heavy_cpu_text_processing(raw_text: str) - list: # 模拟复杂的大正则清洗 cleaned re.sub(r[\s\d\W], , raw_text) # 耗时的大文本结巴分词与停用词过滤 words [w for w in jieba.cut(cleaned) if len(w) 1] return words async def handle_document_request(raw_text: str): loop asyncio.get_running_loop() # 3. 将 CPU 密集型计算安全派发至进程池完全解放主事件循环 processed_words await loop.run_in_executor( process_pool, heavy_cpu_text_processing, raw_text ) # 4. 主事件循环继续从容执行异步网络检索 # 此时主线程零阻塞并发 QPS 丝毫不受影响 # results await vector_store.search(processed_words) return processed_words总结在 asyncio 架构中守住性能底线的核心心智模型是纯异步网络 I/O$\rightarrow$ 直接在主事件循环内await旧版同步 I/O 与 C 扩展计算$\rightarrow$ 派发到专用ThreadPoolExecutor纯 Python 重型 CPU 计算分词、正则、加解密$\rightarrow$ 必须派发到全局共享的ProcessPoolExecutor。唯有在物理层实现 CPU 算力与 I/O 调度的彻底解耦你的 Python 异步系统才能在万级并发重压下稳若泰山。

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号