当前位置: 首页 > article >正文

Python异步编程深度解析:从asyncio到实战应用

Python异步编程深度解析从asyncio到实战应用引言异步编程是现代Python后端开发中不可或缺的技能。作为从Python转向Rust的后端开发者我发现Python的异步生态非常成熟尤其是asyncio库提供了强大的异步编程能力。本文将深入探讨Python异步编程的核心概念和最佳实践帮助你掌握从协程到异步IO的完整知识体系。一、异步编程基础1.1 同步vs异步模式特点适用场景同步阻塞等待CPU密集型任务异步非阻塞等待IO密集型任务1.2 协程概念协程是一种轻量级的并发编程方式允许在单个线程中实现并发import asyncio async def hello(): print(Hello) await asyncio.sleep(1) print(World) asyncio.run(hello())1.3 事件循环事件循环是异步编程的核心负责调度协程的执行async def main(): loop asyncio.get_running_loop() print(fLoop: {loop}) print(fLoop is running: {loop.is_running()}) asyncio.run(main())二、asyncio核心API2.1 创建协程async def fetch_data(url): print(fFetching {url}) await asyncio.sleep(1) # 模拟IO操作 return fData from {url} async def main(): # 创建协程对象 coro fetch_data(https://example.com) print(fCoroutine: {coro}) # 执行协程 result await coro print(fResult: {result}) asyncio.run(main())2.2 并发执行协程async def fetch_data(url, delay): print(fStart fetching {url}) await asyncio.sleep(delay) return fData from {url} async def main(): # 使用asyncio.gather并发执行 results await asyncio.gather( fetch_data(https://api1.com, 2), fetch_data(https://api2.com, 1), fetch_data(https://api3.com, 3) ) print(fResults: {results}) asyncio.run(main())2.3 任务管理async def task_function(name, delay): print(fTask {name} started) await asyncio.sleep(delay) print(fTask {name} completed) return fResult from {name} async def main(): # 创建任务 task1 asyncio.create_task(task_function(A, 2)) task2 asyncio.create_task(task_function(B, 1)) # 等待任务完成 result1 await task1 result2 await task2 print(fResults: {result1}, {result2}) asyncio.run(main())三、异步IO操作3.1 文件操作async def read_file_async(file_path): loop asyncio.get_running_loop() # 使用run_in_executor执行同步IO with open(file_path, r) as f: contents await loop.run_in_executor(None, f.read) return contents async def main(): content await read_file_async(example.txt) print(fFile content: {content[:100]}) asyncio.run(main())3.2 网络请求import aiohttp async def fetch_url(session, url): async with session.get(url) as response: return await response.text() async def main(): async with aiohttp.ClientSession() as session: html await fetch_url(session, https://example.com) print(fHTML length: {len(html)}) asyncio.run(main())3.3 数据库操作import asyncpg async def query_database(): conn await asyncpg.connect(postgresql://user:passlocalhost/db) result await conn.fetch(SELECT * FROM users LIMIT 10) await conn.close() return result asyncio.run(query_database())四、高级异步模式4.1 并发控制async def worker(name, queue): while True: item await queue.get() print(fWorker {name} processing {item}) await asyncio.sleep(1) queue.task_done() async def main(): queue asyncio.Queue() # 添加任务到队列 for i in range(10): queue.put_nowait(i) # 创建多个worker workers [] for i in range(3): task asyncio.create_task(worker(fW{i}, queue)) workers.append(task) # 等待队列清空 await queue.join() # 取消worker for task in workers: task.cancel() await asyncio.gather(*workers, return_exceptionsTrue) asyncio.run(main())4.2 超时处理async def slow_operation(): await asyncio.sleep(5) return Done async def main(): try: result await asyncio.wait_for(slow_operation(), timeout2) print(fResult: {result}) except asyncio.TimeoutError: print(Operation timed out) asyncio.run(main())4.3 信号处理async def handle_signal(): loop asyncio.get_running_loop() def shutdown(): print(Shutting down gracefully...) loop.stop() loop.add_signal_handler(signal.SIGINT, shutdown) # 保持运行 await asyncio.Event().wait() asyncio.run(handle_signal())五、实战异步Web服务器5.1 使用FastAPIfrom fastapi import FastAPI import asyncio app FastAPI() app.get(/) async def root(): await asyncio.sleep(1) return {message: Hello World} app.get(/items/{item_id}) async def read_item(item_id: int, q: str None): await asyncio.sleep(0.5) return {item_id: item_id, q: q}5.2 异步任务队列from fastapi import FastAPI, BackgroundTasks import asyncio app FastAPI() async def process_data(data: str): # 模拟耗时操作 await asyncio.sleep(5) print(fProcessed data: {data}) app.post(/process) async def trigger_processing(data: str, background_tasks: BackgroundTasks): background_tasks.add_task(process_data, data) return {message: Processing started}六、性能优化6.1 避免阻塞调用# 错误示例在异步函数中调用同步阻塞函数 async def bad_example(): # 这会阻塞事件循环 time.sleep(1) # ❌ # 正确示例使用异步替代或线程池 async def good_example(): await asyncio.sleep(1) # ✅ # 或者使用线程池执行阻塞操作 async def better_example(): loop asyncio.get_running_loop() await loop.run_in_executor(None, blocking_function)6.2 使用连接池async def create_pool(): return await asyncpg.create_pool( useruser, passwordpass, databasedb, hostlocalhost, min_size5, max_size20 )6.3 批量操作async def batch_insert(pool, items): async with pool.acquire() as conn: async with conn.transaction(): for item in items: await conn.execute( INSERT INTO table (col1, col2) VALUES ($1, $2), item[col1], item[col2] )七、常见陷阱7.1 忘记awaitasync def get_data(): return data async def main(): # 错误没有await result get_data() # 返回协程对象不是结果 # 正确 result await get_data()7.2 混合同步和异步async def async_func(): # 错误调用同步阻塞函数 requests.get(https://example.com) # 阻塞事件循环 # 正确使用异步HTTP客户端 async with aiohttp.ClientSession() as session: async with session.get(https://example.com) as resp: await resp.text()7.3 线程安全问题# 注意共享状态需要适当的同步 shared_data [] async def add_item(item): # 多个协程同时操作可能导致问题 shared_data.append(item) # 需要考虑线程安全八、总结Python的异步编程为IO密集型应用提供了高效的解决方案。通过掌握asyncio的核心概念和最佳实践我们可以构建高性能的异步应用。关键要点使用协程通过async/await定义异步函数并发执行使用asyncio.gather并发多个协程避免阻塞不要在协程中调用同步阻塞函数任务管理使用Task管理异步任务资源管理正确使用连接池和上下文管理器从Python转向Rust后我发现Rust的Tokio异步运行时在性能和类型安全方面有很大优势但Python的异步生态更加成熟和易用。延伸阅读asyncio官方文档FastAPI官方文档aiohttp官方文档《Python异步编程实战》

相关文章:

Python异步编程深度解析:从asyncio到实战应用

Python异步编程深度解析:从asyncio到实战应用 引言 异步编程是现代Python后端开发中不可或缺的技能。作为从Python转向Rust的后端开发者,我发现Python的异步生态非常成熟,尤其是asyncio库提供了强大的异步编程能力。本文将深入探讨Python异步…...

CI/CD最佳实践:构建高效可靠的持续集成和部署流程

CI/CD最佳实践:构建高效可靠的持续集成和部署流程 一、CI/CD最佳实践概述 1.1 CI/CD最佳实践的定义 CI/CD最佳实践是指在持续集成和持续部署过程中遵循的一系列指导原则和方法。它通过自动化、标准化和可重复的流程,提高软件开发和部署的效率和可靠性。 …...

CSS Grid布局深入解析:掌握现代布局技术

CSS Grid布局深入解析:掌握现代布局技术 引言 CSS Grid布局是CSS3引入的强大布局系统,它提供了一种二维网格布局方式,可以轻松实现复杂的页面布局。本文将深入探讨Grid布局的核心概念、高级技巧和最佳实践。 一、Grid布局基础 1.1 Grid容器与…...

回归模型.

...

小波分析多尺度数据融合算法应用【附算法】

✨ 长期致力于小波分析、多尺度数据融合、MEMS陀螺、Allan方差研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)小波域多尺度融合定理证明与算法框架&a…...

鸿蒙PC:鸿蒙electron跨端框架PC链接雷达实战:把本地收藏夹升级成可巡检的链接管理面板

前言 欢迎加入鸿蒙PC开发者社区,共同打造开发者工具生态:鸿蒙PC开发者社区 :https://harmonypc.csdn.net/ 项目开源地址:https://AtomGit.com/lqjmac/ele_lianjieleida 浏览器收藏夹能保存链接,但不擅长保存判断。 …...

Python数据库设计模式:从ORM到数据层架构

Python数据库设计模式:从ORM到数据层架构 引言 数据库设计是后端开发的核心环节。作为从Python转向Rust的后端开发者,我发现Python的数据库生态非常成熟,尤其是SQLAlchemy提供了强大的ORM能力。本文将深入探讨Python数据库设计模式&#xff0…...

数据科学实践案例与项目管理

数据科学实践案例与项目管理 1. 技术分析 1.1 数据科学项目管理概述 数据科学项目管理是确保项目成功的关键: 项目生命周期问题定义: 明确目标数据收集: 获取数据数据处理: 清洗转换模型开发: 构建模型评估验证: 评估效果部署上线: 生产环境项目管理要素:目标设定进…...

大气层Atmosphere系统深度解析:解锁Switch潜能的终极技术指南

大气层Atmosphere系统深度解析:解锁Switch潜能的终极技术指南 【免费下载链接】Atmosphere-stable 大气层整合包系统稳定版 项目地址: https://gitcode.com/gh_mirrors/at/Atmosphere-stable Atmosphere大气层系统作为Nintendo Switch最稳定、功能最丰富的定…...

Mootdx架构深度解析:Python金融数据接口的工程化实践

Mootdx架构深度解析:Python金融数据接口的工程化实践 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 在金融科技快速发展的今天,数据获取的便捷性与稳定性成为量化分析的基…...

大模型从0训练LLaMA全流程实战——基于昇腾910B集群

用昇腾集群从零训练一个 LLaMA-7B,走完数据准备、代码修改、分布式配置、启动训练、监控调优的全流程。中间踩过的坑都标注在对应步骤里。 1. 硬件与环境确认(训练前必做) 训练大模型对环境的稳定性要求极高,任何一项不达标都可能导致训练中途崩溃。 #!/bin/bash # 训练前…...

2026技术复盘:告别“易碎”代码,实在Agent重塑企业自动化底座

在2026年的数字化转型浪潮中,企业对于“提效”的追求已从单纯的工具引入转向深度的架构治理。 曾被寄予厚望的固定规则自动化脚本,在经历了数年的规模化应用后,其弊端正集中爆发。 许多企业发现,那些耗费巨资编写的脚本&#xff0…...

前缀和与差分进阶总结 | 技巧归纳与实战应用

前缀和与差分进阶总结 | 技巧归纳与实战应用 引言 前缀和与差分是数组处理中两种重要且互补的技术。它们看似简单,却在 LeetCode 和实际工程中有着广泛的应用。前缀和将区间查询从 O(n) 优化到 O(1),差分将区间更新从 O(n) 优化到 O(1)。两者的结合使用可…...

LeetCode 1314:矩阵区域和 | 二维前缀和

LeetCode 1314:矩阵区域和 | 二维前缀和 引言 矩阵区域和(Matrix Block Sum)是 LeetCode 第 1314 题,难度为 Medium。题目要求计算矩阵中以每个元素为中心、KK 子矩阵区域的元素和。这道题是二维前缀和的经典应用,展…...

LeetCode 930:和相同的二元子数组 | 前缀和与哈希表

LeetCode 930:和相同的二元子数组 | 前缀和与哈希表 引言 和相同的二元子数组(Binary Subarrays With Sum)是 LeetCode 第 930 题,难度为 Medium。题目要求在二元数组(元素只有 0 和 1)中找出子数组和等于 …...

LeetCode 1424:对角线遍历 II | 前缀和分组

LeetCode 1424:对角线遍历 II | 前缀和分组 引言 对角线遍历 II(Diagonal Traverse II)是 LeetCode 第 1424 题,难度为 Medium。题目要求按照对角线顺序遍历一个二叉树数组,返回所有对角线上的节点值。这道题展示了前缀…...

SLAM技术路线收敛?不,多模态融合正在重启路线之争

过去几年,SLAM技术路线确实呈现出明确的收敛趋势:纯视觉SLAM逐渐成熟,基于3DGS的实时建图成为新范式,激光SLAM也固化为工业场景的稳健选择。大家一度认为,算法架构的选择题已经做完。然而,多模态融合的深入…...

国曙GOSHINE正式亮相:一家人力资源服务机构的“长期主义”转向!

在人力资源行业,越来越多企业开始意识到:真正困难的,从来不是招聘,而是复杂用工环境下的长期管理。从社保合规到劳动风险,从跨区域用工到组织效率,企业面对的挑战正在不断增加。尤其在劳动密集型行业&#…...

学 Simulink—— 双定子永磁同步电机(DS‑PMSM)的协同控制与转矩提升仿真(带 MATLAB 脚本(直接运行))

目录 手把手教你学 Simulink—— 双定子永磁同步电机(DS‑PMSM)的协同控制与转矩提升仿真 🔥 前言:为什么做双定子 PMSM? 一、DS‑PMSM 结构与工作原理 1.1 基本结构 1.2 数学模型(dq 轴,含互感耦合) 二、协同控制策略:主从 FOC + 转矩叠加 2.1 控制架构(5 大…...

AI Agent Harness Engineering 在房地产中的应用:智能推荐与价值评估

AI Agent Harness Engineering 在房地产中的应用:智能推荐与价值评估 引言:房地产数字化转型的「最后一公里」——智能决策的人机协同闭环 痛点引入:千亿级赛道下的三大决策「卡脖子」难题 房地产作为全球规模最大的实体产业之一(据CBRE世邦魏理仕2024年全球房地产市场报…...

从微服务到 Agent 服务:架构思维的迁移

从微服务到 Agent 服务:架构思维的迁移与落地全指南 第一部分:引言与基础 (Introduction & Foundation) 1. 引人注目的标题 (Compelling Title) 副标题:深入解析微服务痛点、Agent服务原理、架构设计迁移路径与企业级生产实践 2. 摘要/引言 (Abstract / Introduction)…...

3层深度清理技术:Display Driver Uninstaller显卡驱动彻底卸载解决方案

3层深度清理技术:Display Driver Uninstaller显卡驱动彻底卸载解决方案 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-driv…...

AI系列【仅供参考】:周末用笔记本搞点大事:手把手教学部署 1.5、7B 版本 DeepSeek 智能助手

周末用笔记本搞点大事:手把手教学部署 1.5、7B 版本 DeepSeek 智能助手周末用笔记本搞点大事:手把手教学部署 1.5、7B 版本 DeepSeek 智能助手一、工具介绍1.1 DeepSeek1.2 Ollama二、准备工作2.1 系统要求2.2 下载 Ollama 安装包三、Ollama 的安装与验证…...

AI系列【仅供参考】:TRAE 支持自定义模型了,配置个 DeepSeek V4 试试

TRAE 支持自定义模型了,配置个 DeepSeek V4 试试TRAE 支持自定义模型了,配置个 DeepSeek V4 试试原因解决方案底下评论问题一:回答一:回答二:回答三:问题二:回答一:问题三&#xff1…...

React 性能优化:从 3 秒卡顿到 60 帧流畅,我做了这 5 件事

摘要 React 应用越做越大,卡顿问题越来越严重?本文分享 5 个亲测有效的性能优化方案,包括 React.memo 正确使用姿势、useMemo 依赖陷阱、虚拟列表实战、代码分割策略和 Profiler 调试技巧。每个方案都附带真实代码对比,帮你把页面…...

黄仁勋放话:AI基建要烧掉4万亿美元 谁买单?

最近,英伟达掌门人黄仁勋抛出了一句让人瞠目结舌的预测——未来几年,全球在人工智能基础设施上的投入,可能达到4万亿美元。这个数字不是小数目,它相当于某些国家一年的国内生产总值总和。这笔账怎么算的?黄仁勋在达沃斯…...

【应用实战】基于Dify与多Agent的凭证与档案管理

一、智能文档处理:基于Dify与多Agent的凭证与档案管理革新 在金融行业,文档处理贯穿业务始终。传统的纯人工方式不仅耗时费力,而且极易出错。智能文档处理(Intelligent Document Processing, IDP)融合了OCR、自然语言处…...

JWT令牌安全实践详解

JWT令牌安全实践详解 一、JWT概述 JSON Web Token(JWT)是一种用于安全传输信息的开放标准(RFC 7519)。 1.1 JWT结构 ┌───────────────────────────────────────────────────…...

API接口签名验证实战

API接口签名验证实战 一、接口签名概述 API签名验证是保护接口安全的重要手段,防止请求被篡改或伪造。 1.1 签名机制原理 ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ 客…...

API安全设计与防护实战

API安全设计与防护实战 一、API安全概述 API作为系统间交互的接口,是攻击的主要目标。一个安全的API设计需要考虑多个层面的防护,包括认证、授权、数据保护、攻击防护等。 二、API认证机制 2.1 API Key认证 Component public class ApiKeyFilter ex…...