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

Python异步编程优雅实践

在这里插入图片描述
Python 异步编程是现代高效开发的重要技能,尤其在处理 I/O 密集型任务(如网络请求、文件操作)时表现出色。本文将从基础概念入手,逐步深入到高级实践,帮助读者掌握 asyncio 和 aiohttp 等核心工具,最终实现优雅的异步代码设计。无论您是初学者还是有一定经验的开发者,都能从中受益。

1. 什么是异步编程?

  • 同步 vs 异步
# 同步代码示例
import time

def task(name):
    print(f"Task {name} started.")
    time.sleep(2)  # 模拟耗时操作
    print(f"Task {name} finished.")

task("A")
task("B")
输出:

Task A started.
Task A finished.
Task B started.
Task B finished.
# 异步
async def say_hello():
    print("Hello")
    await asyncio.sleep(1)  # 模拟异步操作
    print("World")

# 运行协程
import asyncio
asyncio.run(say_hello())

2. Python 异步编程的核心概念

  • 协程 (Coroutine)
    定义:协程是一种可以暂停和恢复执行的函数。
    使用 async def 定义协程函数。
  • 事件循环是异步编程的核心,负责调度协程。
    示例:如何使用 asyncio.run() 启动事件循环。
  • await 关键字
    用于等待一个异步操作完成。
    注意事项:只能在 async 函数中使用。

3. asyncio 基础用法

async def task_a():
    print("Task A started")
    await asyncio.sleep(2)
    print("Task A finished")

async def task_b():
    print("Task B started")
    await asyncio.sleep(1)
    print("Task B finished")

async def main():
    task1 = asyncio.create_task(task_a())
    task2 = asyncio.create_task(task_b())
    await task1
    await task2

asyncio.run(main())
# asyncio.create_task() 创建并发任务。
# syncio.gather():并行运行多个协程。
# asyncio.wait():更灵活的任务管理。
#  aiohttp:异步 HTTP 请求
import aiohttp
import asyncio

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

async def main():
    urls = [
        "https://example.com",
        "https://httpbin.org/get",
    ]
    async with aiohttp.ClientSession() as session:
        tasks = [fetch(session, url) for url in urls]
        results = await asyncio.gather(*tasks)
        for i, result in enumerate(results):
            print(f"Result from URL {i+1}: {len(result)} bytes")

asyncio.run(main())

相关文章:

  • 安装 Docker Desktop 修改默认安装目录到指定目录
  • 机械学习基础-6.更多分类-数据建模与机械智能课程自留
  • Android Studio安装配置及运行
  • mysql 学习16 视图,存储过程,存储函数,触发器
  • 基础排序算法
  • js第十二题
  • git版本控制工具介绍
  • Python简单语法
  • 从二叉树到红黑树
  • 【R语言】GitHub Copilot安装-待解决
  • 6.2.2 E-R模型
  • 系统思考—系统结构
  • Ubuntu22.04配置cuda/cudnn/pytorch
  • 799. 最长连续不重复子序列
  • iOS 中使用 FFmpeg 的高级功能 - 滤镜(Filters)
  • 切面收集日志
  • MapStruct 中 @BeforeMapping 和 @AfterMapping 注解的使用详解
  • 大数据学习(49) - Flink按键分区状态(Keyed State)
  • 【Java基础】数组性能优化
  • DeepSeek崛起的本质分析:AI变局中的中国机会
  • 电子商务网站建设的意义是什么/网站为什么要seo?
  • 嘉兴网站设计/营销策略ppt
  • 阿里巴巴网站本土化建设/网站seo优化心得
  • 用户反馈数据分析软件园/seo优化的作用
  • 椒江网站建设578做网站/引流推广是什么意思
  • 制作网站可以赚钱吗/seo推广