摘要:当面对大量 I/O 密集型任务时,传统的同步编程可能会因等待外部资源(如网络请求、文件读取等)而导致性能瓶颈。而异步编程的出现,让我们可以一边等待外部资源一边继续处理其他任务,极大地提升了效率。今天的内容,我们将深挖 Python 的异步编程及其实际应用。
当面对大量 I/O 密集型任务时,传统的同步编程可能会因等待外部资源(如网络请求、文件读取等)而导致性能瓶颈。而异步编程的出现,让我们可以一边等待外部资源一边继续处理其他任务,极大地提升了效率。今天的内容,我们将深挖 Python 的异步编程及其实际应用。
异步编程的核心在于非阻塞。与同步编程按顺序执行不同,异步编程可以让程序在等待操作完成的同时,切换去执行其他任务。
特别是以下场景中,异步编程能显著提升性能:
如果你的项目存在高并发需求或频繁的 I/O 操作,异步编程是一个值得掌握的工具。
Python 的 async 和 await 关键字是实现异步编程的基石:
import asyncioasync def main:print("任务开始")await asyncio.sleep(2) # 模拟耗时操作print("任务结束")asyncio.run(main)代码解析:
async def:定义一个异步函数,表明函数内可以使用 await。await:挂起当前任务,等待耗时操作完成后再继续。asyncio 是 Python 内置的异步编程模块,提供了事件循环和任务管理的强大功能。
并发运行多个任务import asyncioasync def task1:print("任务1开始")await asyncio.sleep(3)print("任务1完成")async def task2:print("任务2开始")await asyncio.sleep(1)print("任务2完成")async def main:await asyncio.gather(task1, task2) # 并发运行任务1和任务2asyncio.run(main)输出结果:
任务1开始 任务2开始 任务2完成 任务1完成这里的 asyncio.gather 可以同时运行多个任务,大大减少了等待时间。
创建任务使用 asyncio.create_task 将异步函数包装成任务,便于管理和跟踪:async def example_task:print("运行异步任务")task = asyncio.create_task(example_task)await task
我们以爬取多个网页为例,展示异步编程的优势:
import asyncioimport aiohttpasync def fetch_url(session, url):async with session.get(url) as response:return await response.textasync def main:urls = ["https://example.com","https://httpbin.org","https://python.org"]async with aiohttp.ClientSession as session:tasks = [fetch_url(session, url) for url in urls]results = await asyncio.gather(*tasks)for result in results:print(result[:100]) # 打印前100个字符asyncio.run(main)代码亮点:
使用 aiohttp 实现高效的异步 HTTP 请求。利用 asyncio.gather 同时爬取多个网页。异步 ≠ 并行异步编程主要解决 I/O 密集型任务,CPU 密集型任务需要结合多线程或多进程优化。异常处理
异步任务中可能发生异常,要做好错误捕获:async def faulty_task:raise ValueError("发生错误!")try:await faulty_taskexcept ValueError as e:print(f"捕获异常:{e}")选择合适的库
aiohttp 适用于异步网络请求,aiomysql 和 asyncpg 适用于异步数据库操作。
异步编程是提升 Python 性能的关键工具之一,尤其在需要高并发或频繁 I/O 操作的场景中。今天的学习为你提供了入门的基础,包括异步关键字、asyncio 模块的核心功能,以及实际应用场景。
实践任务:
使用异步编程实现一个简单的网络爬虫,尝试爬取5个网页并记录耗时。探索 aiohttp 文档,熟悉它的更多用法,如异步 POST 请求。预告:
明天我们将学习 Python 的内存管理,探索如何利用工具定位和优化内存问题,进一步提升代码性能。
让我们一起用异步编程,让代码飞起来!
来源:知味编程
免责声明:本站系转载,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与本站联系,我们将在第一时间删除内容!