news 2026/5/11 20:43:22

Python asyncio 完全指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python asyncio 完全指南

Python asyncio 核心概念

asyncio 是 Python 用于编写并发代码的库,基于协程(coroutines)和事件循环(event loop)。核心对象包括:

  • 协程(Coroutine):通过async def定义的函数,使用await挂起执行。
  • 事件循环(Event Loop):调度协程的执行,管理异步任务。
  • Future/TaskFuture表示异步操作的最终结果,TaskFuture的子类,用于包装协程。

基础用法

定义协程并运行:

import asyncio async def hello(): print("Hello") await asyncio.sleep(1) print("World") asyncio.run(hello()) # 启动事件循环

关键点:

  • asyncio.run()是 Python 3.7+ 的入口函数,负责创建和关闭事件循环。
  • await用于挂起协程,直到异步操作完成(如 I/O 或睡眠)。

任务并发管理

通过create_taskgather实现并发:

async def task1(): await asyncio.sleep(2) return "Task 1" async def task2(): await asyncio.sleep(1) return "Task 2" async def main(): # 方式1:create_task t1 = asyncio.create_task(task1()) t2 = asyncio.create_task(task2()) result1, result2 = await t1, await t2 print(result1, result2) # 方式2:gather results = await asyncio.gather(task1(), task2()) print(results) asyncio.run(main())

异步 I/O 操作

与网络请求库(如aiohttp)结合示例:

import aiohttp async def fetch(url): async with aiohttp.ClientSession() as session: async with session.get(url) as response: return await response.text() async def main(): html = await fetch("https://example.com") print(html[:100]) asyncio.run(main())

高级特性

  1. 超时控制
async def long_running_task(): await asyncio.sleep(10) return "Done" async def main(): try: result = await asyncio.wait_for(long_running_task(), timeout=2.0) except asyncio.TimeoutError: print("Timeout!")
  1. 队列(Queue):生产者-消费者模式:
async def producer(queue): for i in range(5): await queue.put(i) await asyncio.sleep(0.5) async def consumer(queue): while True: item = await queue.get() print(f"Consumed: {item}") queue.task_done() async def main(): queue = asyncio.Queue() await asyncio.gather(producer(queue), consumer(queue)) asyncio.run(main())

https://www.zhihu.com/zvideo/1992081414515102207/
https://www.zhihu.com/zvideo/1992081414288601523/
https://www.zhihu.com/zvideo/1992081411776209412/
https://www.zhihu.com/zvideo/1992081410983490058/
https://www.zhihu.com/zvideo/1992081411017031867/
https://www.zhihu.com/zvideo/1992081409662277143/
https://www.zhihu.com/zvideo/1992081408554997536/
https://www.zhihu.com/zvideo/1992081408483680838/
https://www.zhihu.com/zvideo/1992081406529122697/
https://www.zhihu.com/zvideo/1992081404582978832/
https://www.zhihu.com/zvideo/1992081404620722919/
https://www.zhihu.com/zvideo/1992081402775232642/
https://www.zhihu.com/zvideo/1992081401672139800/
https://www.zhihu.com/zvideo/1992081400329937526/
https://www.zhihu.com/zvideo/1992081399889536407/
https://www.zhihu.com/zvideo/1992081399407215761/
https://www.zhihu.com/zvideo/1992081399839216979/
https://www.zhihu.com/zvideo/1992081399583363803/
https://www.zhihu.com/zvideo/1992081398673208186/
https://www.zhihu.com/zvideo/1992081396286637136/
https://www.zhihu.com/zvideo/1992081394579567804/
https://www.zhihu.com/zvideo/1992081391882612845/
https://www.zhihu.com/zvideo/1992081388866933064/
https://www.zhihu.com/zvideo/1992081390523666922/
https://www.zhihu.com/zvideo/1992081389093427180/
https://www.zhihu.com/zvideo/1992081387851896032/
https://www.zhihu.com/zvideo/1992081387629610814/
https://www.zhihu.com/zvideo/1992081384467109570/
https://www.zhihu.com/zvideo/1992081384504842236/
https://www.zhihu.com/zvideo/1992081382793577889/
https://www.zhihu.com/zvideo/1992081381245866102/
https://www.zhihu.com/zvideo/1992081381375882005/
https://www.zhihu.com/zvideo/1992081380553810780/
https://www.zhihu.com/zvideo/1992081377668133201/
https://www.zhihu.com/zvideo/1992081376422430064/
https://www.zhihu.com/zvideo/1992081374388183350/
https://www.zhihu.com/zvideo/1992081375550010031/
https://www.zhihu.com/zvideo/1992081372085511626/
https://www.zhihu.com/zvideo/1992081369992552985/
https://www.zhihu.com/zvideo/1992081367652127214/
https://www.zhihu.com/zvideo/1992081365609494478/
https://www.zhihu.com/zvideo/1992081364208600440/
https://www.zhihu.com/zvideo/1992081362677699552/
https://www.zhihu.com/zvideo/1992081359297074283/
https://www.zhihu.com/zvideo/1992081358445630208/
https://www.zhihu.com/zvideo/1992081356218467656/
https://www.zhihu.com/zvideo/1992081354221966628/
https://www.zhihu.com/zvideo/1992081354599465668/
https://www.zhihu.com/zvideo/1992081334290633508/
https://www.zhihu.com/zvideo/1992081333414020001/
https://www.zhihu.com/zvideo/1992081332537426047/
https://www.zhihu.com/zvideo/1992081333263024630/
https://www.zhihu.com/zvideo/1992081329756590187/
https://www.zhihu.com/zvideo/1992081329752413320/

调试与错误处理

  • 启用调试模式:设置环境变量PYTHONASYNCIODEBUG=1
  • 捕获异常:协程内使用try/except,或通过Task.exception()检查任务异常。

性能优化建议

  • 避免阻塞操作(如同步 I/O),使用异步兼容库(如aiofiles替代文件操作)。
  • 限制并发量:通过信号量(asyncio.Semaphore)控制资源使用。

兼容性说明

  • Python 3.7+ 推荐使用asyncio.run(),旧版本需手动管理事件循环。
  • 与多线程/多进程交互时,使用asyncio.to_thread()loop.run_in_executor()

通过以上方法,可以高效利用 asyncio 构建高性能异步应用。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/8 3:23:38

基础算法:滑动窗口_python版本

滑动窗口算法简介滑动窗口是一种用于处理数组或字符串子区间问题的高效算法。通过维护一个动态窗口(通常由左右指针定义),在遍历过程中调整窗口大小或位置,避免重复计算,将时间复杂度从O(n)优化至O(n)。适用于连续子数…

作者头像 李华
网站建设 2026/5/6 17:56:04

XHook:让AJAX请求拦截变得轻而易举

XHook:让AJAX请求拦截变得轻而易举 【免费下载链接】xhook Easily intercept and modify XHR request and response 项目地址: https://gitcode.com/gh_mirrors/xho/xhook 在现代Web开发中,AJAX请求处理是每个前端开发者都会遇到的场景。无论是需…

作者头像 李华
网站建设 2026/5/9 16:40:30

如何快速掌握红外小目标检测:ISNet完整指南

如何快速掌握红外小目标检测:ISNet完整指南 【免费下载链接】ISNet CVPR2022 ISNet: Shape Matters for Infrared Small Target Detection 项目地址: https://gitcode.com/gh_mirrors/is/ISNet 在计算机视觉领域,红外小目标检测是一个极具挑战性的…

作者头像 李华
网站建设 2026/5/9 6:30:19

JarkViewer图片查看器完整安装配置指南:从零开始快速上手

JarkViewer图片查看器完整安装配置指南:从零开始快速上手 【免费下载链接】jarkViewer A simple image viewer. 一款简单的看图软件。 项目地址: https://gitcode.com/gh_mirrors/ja/jarkViewer 想要一款简单实用的图片查看器吗?JarkViewer就是你…

作者头像 李华
网站建设 2026/5/9 5:53:29

DeepSeek-V2.5:AI编程效率王,多项指标大跃升

DeepSeek-V2.5:AI编程效率王,多项指标大跃升 【免费下载链接】DeepSeek-V2.5 DeepSeek-V2.5是DeepSeek-AI推出的升级版语言模型,融合了DeepSeek-V2-Chat与DeepSeek-Coder-V2-Instruct的优势,具备强大的通用编程能力。优化后更贴近…

作者头像 李华