0

0

Python 使用队列解耦业务逻辑

冰川箭仙

冰川箭仙

发布时间:2026-02-15 15:23:33

|

461人浏览过

|

来源于php中文网

原创

queue.queue不能用于协程场景,因为它基于线程阻塞而非协程挂起,不支持await;应改用asyncio.queue,其通过协程挂起实现背压与异步等待。

python 使用队列解耦业务逻辑

为什么 queue.Queue 不能直接用于协程场景

因为 queue.Queue 是线程安全的阻塞队列,内部用 threading.Condition 实现等待,它会阻塞整个线程——而 asyncio 要求所有等待必须是协程友好的、不阻塞事件循环的。你用 await queue.get() 会报 TypeError: object Queue can't be used in 'await' expression

实操建议:

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

  • 同步逻辑(多线程任务分发):用 queue.Queue,配合 threading.Threadqueue.get(block=True)
  • 异步逻辑(Web 请求处理、后台任务调度):换用 asyncio.Queue,它原生支持 await queue.get()await queue.put()
  • 别混用:不要在 async def 函数里调 queue.Queue.put() 并期望它“自动 await”,它根本不会让出控制权

asyncio.Queue 的背压控制怎么生效

它不像 queue.Queue(maxsize=...) 那样靠阻塞线程来限流,而是靠协程挂起实现背压:当队列满时,await queue.put(item) 会暂停当前协程,直到有空间;当为空时,await queue.get() 暂停直到有数据。这能让生产者和消费者自然速率匹配。

实操建议:

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

  • 初始化时显式设 maxsize,比如 asyncio.Queue(maxsize=100),否则默认无上限,内存可能涨爆
  • 消费者别用 while True: item = await q.get(); q.task_done() 却忘了 await q.join(),否则 q.join() 永远不会返回
  • 多个消费者时,每个完成任务后必须调 q.task_done(),否则 q.join() 不知道任务是否真结束了

如何安全地把旧代码里的 queue.Queue 迁移到 asyncio.Queue

不是简单替换类名就行。同步队列的使用模式(如轮询、超时重试、多线程共享)和异步队列的协作式调度逻辑完全不同,强行套用会导致死锁或资源泄漏。

多瑞(doreesoft)外贸网店系统
多瑞(doreesoft)外贸网店系统

多瑞外贸网店系统立足于全球化贸易往来的一款外贸类企业用户高端应用电子商务系统软件,帮助企业快速搭建网聚全球商机的电子商务系统。本系统使用纯正的英文,国外用户更容易阅读;多年专业外贸设计经验,熟练掌握美式英语,更符合国外用户考虑和解决问题的逻辑;设计风格、用户体验符合国外用户的习惯;简洁明了的设计风格正是欧美用户的所爱,时时推出新模板、紧跟时尚潮流,供您选择。新增加淘宝数据自动导入,批量上传商品,商

下载

实操建议:

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

  • 检查所有 q.get(timeout=...):异步对应的是 await asyncio.wait_for(q.get(), timeout=...),不是 q.get(timeout=...)
  • 移除所有 q.empty()q.qsize() 判断:它们在异步中不可靠(竞态),应依赖 await q.get() 的自然阻塞
  • 原来用 queue.Queue 做跨线程通信?现在得用 asyncio.to_thread() 包装同步函数,再用 asyncio.Queue 在协程间传参

asyncio.Queue 解耦 Web 请求和数据库写入时的典型陷阱

常见错误是启动一个“永远运行”的消费者协程去 await q.get(),但没做异常隔离,导致一个失败的数据库操作让整个消费者崩溃退出,后续消息全积压。

实操建议:

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

  • 消费者内部必须包 try/except,尤其捕获 asyncio.TimeoutError 和数据库驱动抛出的异常,失败项可记录日志或丢进死信队列
  • 别在消费者里直接 await db.execute(...) 后就完事,要加 q.task_done() —— 而且必须放在 finally 块里,确保无论成功失败都标记完成
  • 如果写入耗时波动大,考虑用 asyncio.Semaphore 限制并发写入数,避免 DB 连接池打满,而不是只靠队列长度限流

队列本身不解决业务复杂度,它只是把“谁负责什么时候做什么”显式拆开。真正难的是界定边界:哪些该进队列,哪些该立刻响应,失败后要不要重试、重试几次、谁来兜底。这些没法靠换一个 Queue 类型自动对齐。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

102

2023.09.25

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

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

674

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

345

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

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

24

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

24

2026.01.21

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

95

2026.02.06

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

94

2025.12.01

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

372

2023.06.29

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

145

2026.02.13

热门下载

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

精品课程

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

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 4.3万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.6万人学习

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

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