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

Python异步编程:非科班转码者的指南

Python异步编程非科班转码者的指南前言大家好我是第一程序员名字大人很菜。作为一个非科班转码、正在学习Rust和Python的萌新我最近开始接触异步编程。异步编程是一种处理并发操作的方法它可以让程序在等待I/O操作时不阻塞从而提高程序的性能和响应速度。今天我想分享一下我对Python异步编程的学习心得希望能给同样是非科班转码的朋友们一些参考。一、异步编程基础1.1 同步与异步的区别同步代码按照顺序执行一个操作完成后才开始下一个操作异步代码可以在等待某个操作完成时继续执行其他操作1.2 异步编程的优势提高性能充分利用CPU时间避免阻塞改善响应性提高应用程序的响应速度更好的资源利用减少线程和进程的开销简化代码使用async/await语法代码更加清晰1.3 异步编程的挑战学习曲线需要理解异步编程的概念和模式错误处理异步代码的错误处理与同步代码不同调试困难异步代码的调试比同步代码更复杂库兼容性不是所有的库都支持异步操作二、Python中的异步编程模块2.1 asyncio模块asyncio是Python 3.4中内置的异步编程模块它提供了异步I/O操作的支持coroutine协程使用async def定义await等待协程完成event loop事件循环负责调度协程Future表示异步操作的结果TaskFuture的子类用于执行协程# asyncio模块示例 import asyncio async def say_hello(): print(Hello) await asyncio.sleep(1) print(World) # 运行协程 async def main(): await say_hello() # 启动事件循环 asyncio.run(main())2.2 aiohttp模块aiohttp是一个支持异步HTTP客户端和服务器的库ClientSession异步HTTP客户端web异步HTTP服务器WebSocket支持WebSocket协议# aiohttp模块示例 import aiohttp import asyncio async def fetch_url(url): async with aiohttp.ClientSession() as session: async with session.get(url) as response: return await response.text() async def main(): html await fetch_url(https://www.python.org) print(fFetched {len(html)} characters) asyncio.run(main())2.3 asyncpg模块asyncpg是一个支持异步操作的PostgreSQL客户端库连接池管理数据库连接异步查询支持异步执行SQL查询事务支持支持异步事务# asyncpg模块示例 import asyncpg import asyncio async def main(): # 连接数据库 conn await asyncpg.connect( hostlocalhost, port5432, userpostgres, passwordpassword, databasetest ) # 执行查询 values await conn.fetch(SELECT * FROM users) print(values) # 关闭连接 await conn.close() asyncio.run(main())三、异步编程实践3.1 基本协程协程是异步编程的基本单位它使用async def定义使用await等待其他协程完成# 基本协程示例 import asyncio async def task1(): print(Task 1 starting) await asyncio.sleep(2) print(Task 1 finished) return Task 1 result async def task2(): print(Task 2 starting) await asyncio.sleep(1) print(Task 2 finished) return Task 2 result async def main(): # 顺序执行协程 result1 await task1() result2 await task2() print(fResults: {result1}, {result2}) asyncio.run(main())3.2 并发执行协程使用asyncio.gather()可以并发执行多个协程# 并发执行协程示例 import asyncio async def task1(): print(Task 1 starting) await asyncio.sleep(2) print(Task 1 finished) return Task 1 result async def task2(): print(Task 2 starting) await asyncio.sleep(1) print(Task 2 finished) return Task 2 result async def main(): # 并发执行协程 results await asyncio.gather(task1(), task2()) print(fResults: {results}) asyncio.run(main())3.3 异步上下文管理器使用async with语句可以创建异步上下文管理器# 异步上下文管理器示例 import asyncio import aiohttp class AsyncHttpClient: def __init__(self): self.session None async def __aenter__(self): self.session aiohttp.ClientSession() return self.session async def __aexit__(self, exc_type, exc_val, exc_tb): await self.session.close() async def fetch_url(url): async with AsyncHttpClient() as session: async with session.get(url) as response: return await response.text() async def main(): html await fetch_url(https://www.python.org) print(fFetched {len(html)} characters) asyncio.run(main())3.4 异步生成器使用async def和yield可以创建异步生成器# 异步生成器示例 import asyncio async def async_generator(): for i in range(5): await asyncio.sleep(0.5) yield i async def main(): async for item in async_generator(): print(fReceived: {item}) asyncio.run(main())四、常见问题和解决方案4.1 阻塞操作问题在异步代码中执行阻塞操作会导致整个事件循环阻塞解决方案使用asyncio.to_thread()将阻塞操作移到线程中使用loop.run_in_executor()执行阻塞操作寻找支持异步的库# 处理阻塞操作 import asyncio import time def blocking_operation(): print(Starting blocking operation) time.sleep(2) # 阻塞操作 print(Blocking operation finished) return Block operation result async def main(): # 使用to_thread执行阻塞操作 result await asyncio.to_thread(blocking_operation) print(fResult: {result}) asyncio.run(main())4.2 错误处理问题异步代码的错误处理与同步代码不同解决方案使用try-except捕获异步代码中的异常使用asyncio.gather()的return_exceptions参数实现自定义的错误处理逻辑# 错误处理示例 import asyncio async def task1(): print(Task 1 starting) await asyncio.sleep(1) raise Exception(Task 1 failed) async def task2(): print(Task 2 starting) await asyncio.sleep(1) return Task 2 result async def main(): # 捕获单个协程的异常 try: result await task1() print(fResult: {result}) except Exception as e: print(fError: {e}) # 捕获多个协程的异常 results await asyncio.gather(task1(), task2(), return_exceptionsTrue) print(fResults: {results}) asyncio.run(main())4.3 死锁问题异步代码中也可能出现死锁解决方案避免嵌套等待使用超时机制合理设计协程的依赖关系4.4 性能优化问题异步代码的性能可能不如预期解决方案减少协程的创建和销毁合理使用连接池避免不必要的上下文切换优化I/O操作五、Python与Rust异步编程对比作为一个同时学习Python和Rust的转码者我发现这两种语言的异步编程机制有很大的不同5.1 Python异步编程特点基于协程使用async/await语法单线程在单个线程中执行异步操作事件循环使用事件循环调度协程易于使用语法简洁学习曲线较平缓性能适合I/O密集型任务不适合CPU密集型任务5.2 Rust异步编程特点基于Future使用Future trait多线程支持多线程执行异步操作无运行时编译时生成状态机性能接近同步代码的性能学习曲线相对较陡需要理解Future和异步运行时5.3 学习借鉴从Python学习学习异步编程的基本概念和模式从Rust学习学习高性能的异步编程方法实践结合根据不同的场景选择合适的语言和异步模型六、实践案例6.1 异步Web服务器# 异步Web服务器 from aiohttp import web import asyncio async def handle(request): name request.match_info.get(name, World) await asyncio.sleep(0.5) # 模拟异步操作 return web.Response(textfHello, {name}!) async def init_app(): app web.Application() app.add_routes([ web.get(/, handle), web.get(/{name}, handle) ]) return app if __name__ __main__: web.run_app(init_app())6.2 异步网络爬虫# 异步网络爬虫 import aiohttp import asyncio from bs4 import BeautifulSoup async def fetch_url(session, url): print(fFetching {url}) async with session.get(url) as response: html await response.text() soup BeautifulSoup(html, html.parser) title soup.title.string if soup.title else No title print(fFetched {url}: {title}) return title async def main(): urls [ https://www.python.org, https://www.google.com, https://www.github.com, https://www.stackoverflow.com, https://www.reddit.com ] async with aiohttp.ClientSession() as session: tasks [fetch_url(session, url) for url in urls] results await asyncio.gather(*tasks) print(All URLs fetched) print(fResults: {results}) asyncio.run(main())6.3 异步数据库操作# 异步数据库操作 import asyncpg import asyncio async def main(): # 创建连接池 pool await asyncpg.create_pool( hostlocalhost, port5432, userpostgres, passwordpassword, databasetest, min_size1, max_size10 ) # 执行查询 async with pool.acquire() as conn: # 创建表 await conn.execute( CREATE TABLE IF NOT EXISTS users ( id SERIAL PRIMARY KEY, name TEXT, email TEXT ) ) # 插入数据 await conn.execute( INSERT INTO users (name, email) VALUES ($1, $2) , Alice, aliceexample.com) # 查询数据 users await conn.fetch(SELECT * FROM users) print(users) # 关闭连接池 await pool.close() asyncio.run(main())七、总结Python的异步编程是一种强大的技术它可以提高程序的性能和响应速度尤其是在处理I/O密集型任务时。作为一个非科班转码者我认为学习Python的异步编程不仅可以提高代码的效率还可以培养异步思维能力。在学习Python的过程中我深刻体会到异步编程的重要性。一个良好的异步设计可以显著提高程序的性能减少资源的使用。同时学习Rust的异步编程机制也可以帮助我们从不同的角度理解异步编程提高我们的编程能力。异步编程是一个复杂的话题需要我们在实践中不断学习和总结。通过合理的异步设计和实现我们可以写出更加高效、可靠的Python代码。保持学习保持输出。虽然现在我还是个菜鸡但我相信只要坚持总有一天能成为真正的「第一程序员」

相关文章:

Python异步编程:非科班转码者的指南

Python异步编程:非科班转码者的指南 前言 大家好,我是第一程序员(名字大,人很菜)。作为一个非科班转码、正在学习Rust和Python的萌新,我最近开始接触异步编程。异步编程是一种处理并发操作的方法&#xff0…...

基于django+vue的智慧物业来访预约报修管理系统

目录功能模块划分核心业务功能特色功能设计技术实现要点扩展性设计项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作功能模块划分 后台管理(Django) 用户权限管理:业主、物业管理员、维修人员…...

ONNX Runtime C++部署踩坑记:GetInputName已弃用,手把手教你改用GetInputNameAllocated

ONNX Runtime C部署实战:从GetInputName到GetInputNameAllocated的平滑迁移指南 在深度学习模型部署的生态系统中,ONNX Runtime凭借其跨平台特性和高性能推理能力,已成为工业界广泛采用的推理引擎。然而,随着其C API的迭代升级&a…...

不会写Shader代码?用PBR Graph制作动态海水效果全流程(Unity 2022版)

不会写Shader代码?用PBR Graph制作动态海水效果全流程(Unity 2022版) 当阳光穿透虚拟海面时,那些闪烁的波纹和渐变的光影往往需要复杂的数学公式——但今天,我们完全可以在不触碰一行CG代码的情况下,用Sha…...

MedGemma与Ray集成:分布式医学AI训练

MedGemma与Ray集成:分布式医学AI训练 1. 引言 医学AI模型训练正面临着一个关键挑战:随着模型参数量的增加和医学数据集的扩大,单机训练已经无法满足需求。一张高分辨率CT影像可能达到GB级别,而完整的医学影像数据集往往需要TB级…...

新手避坑指南:安捷伦/是德示波器探头选1MΩ还是50Ω?实测对比告诉你差别有多大

示波器探头阻抗选择实战手册:1MΩ与50Ω的黄金法则 第一次接触示波器时,我犯了个低级错误——用1MΩ探头直接测量射频电路,结果不仅波形畸变成锯齿状,还差点烧毁前端放大器。这个价值3000元的教训让我深刻认识到:探头…...

Flutter开发必备:GetX路由管理实战技巧(含完整Demo)

Flutter开发必备:GetX路由管理实战技巧(含完整Demo) 如果你正在使用Flutter开发应用,却对原生路由管理的繁琐感到头疼,GetX的路由管理方案或许能让你眼前一亮。这个轻量级库不仅简化了页面跳转、传值等基础操作&#x…...

手把手教你用V4L2实现USB摄像头采集(附ioctl调用避坑指南)

V4L2 USB摄像头采集实战:从设备配置到帧捕获的完整指南 1. V4L2框架概述与开发环境搭建 Video4Linux2(简称V4L2)是Linux内核中针对视频设备的标准驱动框架,它为USB摄像头、采集卡等视频设备提供了一套统一的编程接口。作为嵌入式…...

TensorRT实战:从模型转换到部署推理的完整指南

1. TensorRT入门:为什么选择它? 如果你正在寻找一种能够让你的深度学习模型在生产环境中飞起来的方法,TensorRT绝对是你的不二之选。简单来说,TensorRT是NVIDIA推出的高性能推理优化器和运行时引擎,专门为NVIDIA GPU设…...

如何高效解析和生成PSD文件:Ag-PSD库完整指南

如何高效解析和生成PSD文件:Ag-PSD库完整指南 【免费下载链接】ag-psd Javascript library for reading and writing PSD files 项目地址: https://gitcode.com/gh_mirrors/ag/ag-psd 在当今数字设计工作流中,Photoshop文档(PSD&#…...

互联网应用架构:LiuJuan20260223Zimage高并发服务设计

互联网应用架构:LiuJuan20260223Zimage高并发服务设计 1. 引言 想象一下这样的场景:你的图片服务突然火了,每秒有几十万用户同时上传和查看图片,服务器开始报警,响应速度越来越慢,用户体验直线下降。这不…...

解决Ubuntu 22.04开发板更新源404错误的ARM架构适配指南

1. 为什么ARM开发板更新源会报404错误? 最近在树莓派上折腾Ubuntu 22.04时,遇到了一个让人抓狂的问题:无论换成阿里云、清华还是中科大的镜像源,执行apt update时总是报404错误。刚开始以为是网络问题,反复重试了好几次…...

从libdatachannel到AioRTC:构建轻量级WebRTC原型实践指南

1. 为什么选择libdatachannel和AioRTC 最近在研究浏览器音视频流推送技术时,我发现WebRTC虽然强大但入门门槛较高。经过多轮技术选型对比,最终锁定了两个轻量级开源库:C的libdatachannel和Python的AioRTC。这两个项目特别适合快速原型开发&am…...

BarrageGrab技术深度解析:构建高可用跨平台直播弹幕抓取架构

BarrageGrab技术深度解析:构建高可用跨平台直播弹幕抓取架构 【免费下载链接】BarrageGrab 抖音快手bilibili直播弹幕wss直连,非系统代理方式,无需多开浏览器窗口 项目地址: https://gitcode.com/gh_mirrors/ba/BarrageGrab 在当今直播…...

Driver Store Explorer:Windows驱动管理的终极解决方案

Driver Store Explorer:Windows驱动管理的终极解决方案 【免费下载链接】DriverStoreExplorer Driver Store Explorer [RAPR] 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer Driver Store Explorer(简称RAPR)是一…...

UMA模型深度解析:机器学习加速的科学计算革命与高通量筛选架构揭秘

UMA模型深度解析:机器学习加速的科学计算革命与高通量筛选架构揭秘 【免费下载链接】ocp Open Catalyst Projects library of machine learning methods for catalysis 项目地址: https://gitcode.com/GitHub_Trending/oc/ocp 在计算材料科学与催化研究领域…...

FireRed-OCR StudioGPU适配方案:多卡并行解析长文档的配置详解

FireRed-OCR StudioGPU适配方案:多卡并行解析长文档的配置详解 1. 工业级文档解析工具概述 FireRed-OCR Studio是一款基于Qwen3-VL模型开发的下一代文档解析工具,专为处理复杂文档场景设计。它不仅能够精准识别文字内容,更能完整还原文档中…...

对于对话中的反讽识别,OpenClaw 的模型是否结合了语调特征?

关于OpenClaw模型在反讽识别中是否结合了语调特征,这个问题其实触及了当前自然语言处理中一个相当微妙的领域。从技术实现的角度来看,OpenClaw这类基于Transformer架构的大语言模型,其训练数据主要来源于互联网上的文本语料,比如网…...

STM32实战:为小米CyberGear/灵足电机构建机械限位零点与位置模式正弦轨迹

1. 小米CyberGear电机零点丢失问题解析 第一次用小米CyberGear电机做项目时,我就被它断电后零点丢失的问题坑得不轻。早上调好的机械臂,下午上电就歪了30度,这种体验相信很多开发者都遇到过。这其实是大多数伺服电机的通病——断电后编码器位…...

4步精通OpenCore EFI制作:OpCore-Simplify智能配置引擎全解析

4步精通OpenCore EFI制作:OpCore-Simplify智能配置引擎全解析 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 在黑苹果技术领域&#xff0…...

从图片预览需求看H5监听浏览器返回事件的3种实现方案(含history API避坑指南)

从图片预览需求看H5监听浏览器返回事件的3种实现方案(含history API避坑指南) 在移动端H5开发中,图片预览功能几乎是标配需求。随着全面屏手势操作的普及,用户越来越习惯通过滑动返回退出预览,而非点击关闭按钮。这种交…...

掌握AI落地三件套:微调、Agent、部署,让你薪资直冲20K+!

文章核心内容是介绍AI行业高薪技能,即掌握大模型落地的“三件套”:微调、Agent、部署。微调是将通用模型变为专属专家的关键,Agent开发让模型能自动解决问题,部署则是基础但重要的能力。文章还强调了传统AI基础的重要性&#xff0…...

告别AP离线!深入浅出解析神州数码AC/AP注册机制:二层发现 vs. DHCP Option 43实战选型

神州数码无线网络部署实战:AC与AP注册机制深度解析 在企业无线网络部署中,AC(无线控制器)与AP(无线接入点)的注册机制是构建稳定无线网络的基础环节。神州数码作为国内领先的网络设备提供商,其A…...

Exo分布式AI集群架构深度解析:多节点选举与容错机制实现原理

Exo分布式AI集群架构深度解析:多节点选举与容错机制实现原理 【免费下载链接】exo Run your own AI cluster at home with everyday devices 📱💻 🖥️⌚ 项目地址: https://gitcode.com/GitHub_Trending/exo8/exo Exo是一…...

别再死记硬背了!一文搞懂EtherCAT四种寻址方式(附FMMU配置实例)

深入解析EtherCAT四大寻址机制:从原理到实战配置 第一次接触EtherCAT的工程师,往往会被其复杂的寻址方式搞得晕头转向。位置寻址、节点寻址、逻辑寻址、广播寻址——这些术语听起来相似却又各具特点,死记硬背不仅效率低下,更会在实…...

ORCAD TCL脚本菜单化加载与性能调优实践

1. ORCAD TCL脚本菜单化加载的必要性 作为一名在电子设计自动化领域摸爬滚打多年的工程师,我深刻理解ORCAD用户在使用TCL脚本时遇到的痛点。当你的脚本库逐渐壮大,每次启动ORCAD都要自动加载几十个脚本文件,那种等待的煎熬简直让人抓狂。我曾…...

TinySAM完整指南:如何在5分钟内实现高效图像分割

TinySAM完整指南:如何在5分钟内实现高效图像分割 【免费下载链接】TinySAM 项目地址: https://gitcode.com/gh_mirrors/ti/TinySAM TinySAM是一款革命性的轻量化"分割任何物体"模型,它通过知识蒸馏和量化技术,在保持强大零…...

手把手教你用示波器调试BLDC驱动电路:电流检测与PWM信号分析全流程

手把手教你用示波器调试BLDC驱动电路:电流检测与PWM信号分析全流程 调试无刷直流电机(BLDC)驱动电路时,示波器是最关键的诊断工具之一。本文将带您从零开始,逐步掌握如何通过示波器观察PWM信号、解析电流波形&#xff…...

Houdini VEX实战:5步搞定变形管道的中心线生成(附常见问题修复)

Houdini VEX实战:5步搞定变形管道的中心线生成(附常见问题修复) 在三维动画制作中,处理变形管道的中心线是许多技术美术师面临的常见挑战。无论是角色动画中的血管、机械装置中的电缆,还是科幻场景中的能量管道&#x…...

Python智能内存管理策略深度拆解(CPython内存池机制全图谱曝光)

第一章:Python智能内存管理策略全景导览Python 的内存管理并非由开发者手动控制,而是通过一套高度集成的自动化机制协同运作,涵盖引用计数、循环垃圾回收(GC)、内存池分配(pymalloc)三大核心支柱…...