0

0

Python 异步编程常见误区总结

舞夢輝影

舞夢輝影

发布时间:2026-01-29 17:14:57

|

610人浏览过

|

来源于php中文网

原创

async/await 不等于自动并发,单个 await 是顺序等待,需用 asyncio.gather() 或 create_task() 显式并发;CPU 密集型任务应使用 ProcessPoolExecutor;未 await 可等待对象会导致逻辑跳过或静默失败;异步上下文须用 contextvars 而非 threading.local。

python 异步编程常见误区总结

async/await 不等于自动并发

很多人以为只要把函数改成 async def,再用 await 调用,程序就会“变快”或“自动并行”。事实并非如此:单个 await 是顺序等待,不触发并发;只有显式调度多个协程(如用 asyncio.gather()asyncio.create_task())才可能并发执行。

常见错误现象:
– 写了 5 个 await fetch_data() 连续调用,耗时接近 5 倍单次;
– 混淆 await asyncio.sleep(1)time.sleep(1),后者会阻塞整个事件循环。

  • 真正并发需用 asyncio.gather(task1(), task2(), task3()) 批量 await
  • asyncio.create_task() 提前启动协程,适合有依赖或需控制生命周期的场景
  • CPU 密集型任务不能靠 async 加速,应改用 concurrent.futures.ProcessPoolExecutor

在同步代码里直接调用 async 函数会报错

比如在普通函数里写 result = my_async_func(),实际返回的是 coroutine 对象,不是结果;若不 await 或用 asyncio.run() 驱动,就只是个未执行的协程——后续一旦尝试打印或使用,大概率触发 RuntimeWarning: coroutine 'xxx' was never awaited

使用场景常见于:单元测试、脚本快速验证、与老代码混用。

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

Singify
Singify

Singify是一款AI歌曲与音乐生成器。轻松生成原创歌曲、翻唱热门音乐、混音个性风格。

下载
  • 调试时想临时跑一个 async 函数?用 asyncio.run(my_async_func())
  • 在同步上下文中需要等结果?必须用 asyncio.run(),不能只调用不驱动
  • 切勿在 __init__@property、日志格式化等同步钩子里直接调 async 函数

忘记 await 可等待对象(如 Task、Future)导致逻辑跳过

asyncio.create_task() 返回的是 Task 对象,它本身是可等待的(awaitable),但如果不 await 它,协程就只是被调度、然后被丢弃——任务可能中途被取消,也可能静默失败,而主协程早已结束。

典型错误:
task = asyncio.create_task(fetch_user()) 后没 await task
– 用 asyncio.ensure_future() 但没收集返回值或 await;
– 在 try/except 外层漏掉 await,导致异常无法被捕获。

  • 所有通过 create_task()ensure_future()to_thread() 启动的可等待对象,都应明确 await 或加入 gather
  • 若需“发完即忘”,至少加 asyncio.current_task().get_loop().create_task(...) 并确保 loop 不提前关闭
  • asyncio.wait_for(task, timeout=...) 包一层,避免无限挂起

误用 threading.local 在异步上下文中失效

很多开发者习惯用 threading.local() 存储请求上下文(如用户 ID、trace_id),但在 asyncio 中,协程可能在不同线程间切换(尤其用了 loop.run_in_executor),且单线程内多个协程共享同一 thread-local,导致数据污染或丢失。

表现症状:
– A 请求的 trace_id 意外出现在 B 请求日志中;
local.var = 'x' 后,在另一个 await 点取不到值;
– 使用 contextvars 前,用 threading.local 实现的中间件在压测下出错。

  • 异步上下文隔离请用 contextvars.ContextVar,它是 asyncio 原生支持的
  • ContextVar 必须在协程开始时 set(如中间件入口),并在每个 await 分界点后仍有效
  • 不要试图在 run_in_executor 的子线程里读写主线程的 ContextVar,需手动传递值
async/await 的边界比看起来更硬:它不是语法糖,而是一套协作式调度契约。最常被忽略的,是「可等待对象」必须被显式驱动,以及 context 隔离机制完全不同于线程模型——这两点一旦出错,问题往往延迟暴露、难以复现。

相关文章

编程速学教程(入门课程)
编程速学教程(入门课程)

编程怎么学习?编程怎么入门?编程在哪学?编程怎么学才快?不用担心,这里为大家提供了编程速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

178

2024.05.11

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

215

2025.12.18

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

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

503

2023.08.10

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

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

503

2023.08.10

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

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

87

2025.12.01

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

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

15

2026.01.29

clawdbot龙虾机器人官网入口 clawdbot ai官方网站地址
clawdbot龙虾机器人官网入口 clawdbot ai官方网站地址

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

12

2026.01.29

Golang 网络安全与加密实战
Golang 网络安全与加密实战

本专题系统讲解 Golang 在网络安全与加密技术中的应用,包括对称加密与非对称加密(AES、RSA)、哈希与数字签名、JWT身份认证、SSL/TLS 安全通信、常见网络攻击防范(如SQL注入、XSS、CSRF)及其防护措施。通过实战案例,帮助学习者掌握 如何使用 Go 语言保障网络通信的安全性,保护用户数据与隐私。

8

2026.01.29

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

548

2026.01.28

热门下载

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

精品课程

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

共4课时 | 22.3万人学习

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号