0

0

Python 并发模型选型指南

冰川箭仙

冰川箭仙

发布时间:2026-01-29 12:50:03

|

309人浏览过

|

来源于php中文网

原创

asyncio适合I/O密集、无强状态依赖且全栈异步支持的场景;不适合CPU密集、含阻塞C扩展或依赖同步库的情况,混用会阻塞事件循环。

python 并发模型选型指南

asyncio 适合什么场景,又不适合什么

如果 I/O 密集、协程间无强状态依赖、且你能控制所有关键库是否支持异步(比如 aiohttp 而非 requests),asyncio 是首选。它在单线程内靠事件循环调度,开销小、并发高。

但一旦混入 CPU 密集操作(如图像处理、数值计算),或调用大量阻塞式 C 扩展(如某些 numpy 操作未显式释放 GIL)、或依赖的第三方库只有同步接口(如多数 psycopg2 旧版本),asyncio 就会卡住整个事件循环——这不是 bug,是设计使然。

  • 别指望 asyncio.to_thread() 能“拯救”所有同步调用;频繁跨线程切走会抵消异步收益
  • asyncio.run() 每次都新建事件循环,短生命周期脚本没问题,长期服务要自己管理 asyncio.get_event_loop()
  • 调试时看到 RuntimeWarning: coroutine 'xxx' was never awaited,基本是忘了 await 或误把协程当普通函数调了

多进程 vs 多线程:GIL 不是唯一决定因素

Python 的 GIL 确实让多线程无法真正并行执行 CPU 密集任务,但这不等于“线程没用”。对 I/O 密集型任务(如大量 HTTP 请求、文件读写),threading 开销低、启动快、共享内存方便,反而是更轻量的选择。

multiprocessing 虽能绕过 GIL,但进程创建/通信成本高,对象序列化(pickle)限制多,且 Windows 下默认启动方式是 spawn,导致模块级代码重复执行——常见错误是把 if __name__ == '__main__': 漏掉,直接报 AttributeError: Can't get attribute 'xxx' on

立即学习Python免费学习笔记(深入)”;

佳蓝在线销售系统(创业版) 佳蓝在线销售
佳蓝在线销售系统(创业版) 佳蓝在线销售

1、对ASP内核代码进行DLL封装,从而大大提高了用户的访问速度和安全性;2、采用后台生成HTML网页的格式,使程序访问速度得到进一步的提升;3、用户可发展下级会员并在下级购买商品时获得差额利润;4、全新模板选择功能;5、后台增加磁盘绑定功能;6、后台增加库存查询功能;7、后台增加财务统计功能;8、后台面值类型批量设定;9、后台财务曲线报表显示;10、完善订单功能;11、对所有传输的字符串进行安全

下载
  • concurrent.futures.ThreadPoolExecutor 控制线程数比裸写 threading.Thread 更安全,避免资源耗尽
  • multiprocessing.Poolmap() 默认不支持关键字参数;要用 starmap() 或封装成单参数元组
  • 子进程无法继承父进程的 logging 配置,需显式重置 handler 和 level

何时该上 trio / curio,而不是死磕 asyncio

asyncio 的 API 设计偏底层,取消传播、超时嵌套、任务隔离等逻辑容易出错。如果你的项目需要强可靠性(比如金融类定时结算、设备长连接保活),trio 的结构化并发模型会更省心:每个 async with trio.open_nursery() 块天然保证子任务全部结束才退出,异常自动传播,无需手动 gather() + cancel()

但代价是生态窄——trio 兼容的 HTTP 客户端只有 httpx(且得指定 backend="trio"),数据库驱动几乎为零。你不能一边用 trio 写主逻辑,一边拿 asyncpg(只支持 asyncio)去查库,否则会触发 RuntimeError: This event loop is already running

  • curio 更激进,连 async/await 都不用,全靠 async def + await + 显式 sleep(),学习曲线陡,社区支持弱,仅建议实验性项目尝试
  • 别试图用 anyio 当万能胶水——它只是统一了 API 表面,底层仍是 asynciotrio,切换后仍要重测所有 I/O 组件

混合模型不是银弹,但有时真得这么干

现实系统常同时存在 CPU 密集(如视频转码)、I/O 密集(如上报日志)、和外部阻塞调用(如调用某老 C 库的 SDK)。纯一种模型撑不住,必须分层:主线程跑 asyncio 处理网络,CPU 工作扔给 multiprocessing.Process,阻塞 SDK 调用丢进 concurrent.futures.ThreadPoolExecutor 并设好 max_workers=1 防止线程爆炸。

难点不在启动,而在状态同步与错误透传。比如子进程崩溃,asyncio 主循环不会自动感知;线程池里抛了异常,若没用 future.result() 主动取,就会静默丢失。

  • asyncio.Queue 在协程与子进程间传数据,别用 multiprocessing.Queue——后者不 await 友好
  • 所有跨模型边界的操作,务必加超时(asyncio.wait_for()future.result(timeout=...)),否则一个卡死就拖垮全局
  • logging 本身是线程安全的,但多进程下需用 QueueHandler + 单独日志进程,否则日志错乱或丢失

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

778

2023.08.22

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1130

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

213

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1728

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

20

2026.01.19

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

397

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

575

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

503

2023.08.10

clawdbot ai使用教程 保姆级clawdbot部署安装手册
clawdbot ai使用教程 保姆级clawdbot部署安装手册

Clawdbot是一个“有灵魂”的AI助手,可以帮用户清空收件箱、发送电子邮件、管理日历、办理航班值机等等,并且可以接入用户常用的任何聊天APP,所有的操作均可通过WhatsApp、Telegram等平台完成,用户只需通过对话,就能操控设备自动执行各类任务。

11

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 3.6万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号