Day 7: 异步编程——让你的 Python 高效无阻

liftword4个月前 (01-24)技术文章32

当面对大量 I/O 密集型任务时,传统的同步编程可能会因等待外部资源(如网络请求、文件读取等)而导致性能瓶颈。而异步编程的出现,让我们可以一边等待外部资源一边继续处理其他任务,极大地提升了效率。今天的内容,我们将深挖 Python 的异步编程及其实际应用。


为什么需要异步编程?

异步编程的核心在于非阻塞。与同步编程按顺序执行不同,异步编程可以让程序在等待操作完成的同时,切换去执行其他任务。
特别是以下场景中,异步编程能显著提升性能:

  • 网络爬虫:需要并发发起大量 HTTP 请求。
  • 数据库查询:频繁的异步查询操作。
  • 文件操作:处理大规模的文件读写。

如果你的项目存在高并发需求或频繁的 I/O 操作,异步编程是一个值得掌握的工具。


Python 的异步编程基础

1. async 和 await 的基本概念

Python 的 async 和 await 关键字是实现异步编程的基石:

import asyncio

async def main():
    print("任务开始")
    await asyncio.sleep(2)  # 模拟耗时操作
    print("任务结束")

asyncio.run(main())

代码解析

  • async def:定义一个异步函数,表明函数内可以使用 await。
  • await:挂起当前任务,等待耗时操作完成后再继续。

2. asyncio 模块的核心功能

asyncio 是 Python 内置的异步编程模块,提供了事件循环和任务管理的强大功能。

  • 并发运行多个任务
import asyncio

async 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和任务2

asyncio.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 asyncio
import aiohttp

async def fetch_url(session, url):
    async with session.get(url) as response:
        return await response.text()

async 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())

代码亮点

  1. 使用 aiohttp 实现高效的异步 HTTP 请求。
  2. 利用 asyncio.gather 同时爬取多个网页。

注意事项与性能提升

  1. 异步 ≠ 并行
    异步编程主要解决 I/O 密集型任务,CPU 密集型任务需要结合多线程或多进程优化。
  2. 异常处理
    异步任务中可能发生异常,要做好错误捕获:
async def faulty_task():
    raise ValueError("发生错误!")

try:
    await faulty_task()
except ValueError as e:
    print(f"捕获异常:{e}")
  1. 选择合适的库
    aiohttp 适用于异步网络请求,aiomysql 和 asyncpg 适用于异步数据库操作。

今天的总结与任务

异步编程是提升 Python 性能的关键工具之一,尤其在需要高并发或频繁 I/O 操作的场景中。今天的学习为你提供了入门的基础,包括异步关键字、asyncio 模块的核心功能,以及实际应用场景。

实践任务:

  1. 使用异步编程实现一个简单的网络爬虫,尝试爬取5个网页并记录耗时。
  2. 探索 aiohttp 文档,熟悉它的更多用法,如异步 POST 请求。

预告:
明天我们将学习 Python 的内存管理,探索如何利用工具定位和优化内存问题,进一步提升代码性能。

让我们一起用异步编程,让代码飞起来!

相关文章

Python:被忽视的核心功能(python核心理念)

【编者按】这篇文章主要介绍了一些在 Python 编程中可能被忽视的核心功能,包括默认参数、海象运算符、*args 和 **kwargs 的使用、变量交换、str 与 repr 的区别、可迭代对象的扩...

活体脑细胞做成16核芯片,用Python就能编程

梦晨 发自 凹非寺量子位 | 公众号 QbitAI首个“脑PU”来了!由“16核”类人脑器官(human brain organoids)组成。这项研究来自瑞士生物计算创业公司FinalSpark,并...

await 协议,一个能实现高效异步编程的世界最牛的Python知识点

点击蓝字 关注我们《await 协议,一个能实现高效异步编程的世界最牛的Python知识点》1.引言你是否曾为 Python 异步编程的复杂性而苦恼?回调地狱、繁琐的语法……是不是让你望而却步?今天,...

神仙级python入门教程(非常详细),从0到精通,从看这篇开始!

python入门虽然简单,很多新手依然卡在基础安装阶段,大部分教程对一些基础内容都是一带而过,好多新手朋友,对一些基础知识常常一知半解,需要在网上查询很久。扎实的基础知识,对之后的学习、工作都是非常必...

pytorch——人工智能的开源深度学习框架

人工智能研究所在头条上的第一篇文章介绍的是tensorflow,tensorflow是Google旗下的开源深度学习框架,我们在往期的分享中,也介绍了其相关方面的文章,从安装到基础的CNN卷积神经网络...