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

liftword5个月前 (01-24)技术文章47

当面对大量 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 的内存管理,探索如何利用工具定位和优化内存问题,进一步提升代码性能。

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

相关文章

编译器大佬全新编程语言Mojo:兼容Python核心功能,提速35000倍

机器之心报道编辑:蛋酱、陈萍它可与 Python 无缝衔接,但克服了很多 Python 的缺点。Jeremy Howard 试用后表示:「Mojo 可能是几十年来最大的编程进步。」对于全球各地开发者来...

Python四大主流网络编程框架,你知道么?

高并发处理框架—— TornadoTornado 是使用 Python 编写的一个强大的可扩展的 Web 服务器。它在处理高网络流量时表现得足够强健,却在创建和编写时有着足够的轻量级,并能够被用在大量...

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

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

硬核!Python核心知识笔记(附思维导图,建议收藏),小白福利

导读:本文向大家展示一份Python核心知识笔记。该笔记通俗易懂,代码齐全,十分适合Python初学者学习借鉴,文末有获取方式。该笔记学习思维导图:目录常用数据类型函数式编程进程、线程和协程正则表达式...

Python类编写的进阶之路:从入门到精通的五个层次

文章摘要本文深入探讨Python类编写的五个层次,从基本类创建到继承和方法重写、抽象类和多态等高级概念,结合代码示例和实践分析,帮助读者逐步掌握Python面向对象编程的核心技能,提升代码质量和可维护...