Python进阶教程第 19 章:Python 异步编程 asyncio 协程、并发与并行

  • 时间:2025-11-23 20:22 作者: 来源: 阅读:0
  • 扫一扫,手机访问
摘要:19.1 引言在处理 大量网络 I/O、文件 I/O 等场景时,传统同步程序会由于等待阻塞而性能低下。Python 提供了 asyncio 库支持协程式异步编程,可以高效地同时处理大量任务。本章将学习:协程与 async/await 语法使用 asyncio 并发执行任务异步 HTTP 请求区分并发与并行19.2 协程基础(async / await)19.2.1 定义和运行协程 示例:impor

19.1 引言

在处理 大量网络 I/O、文件 I/O 等场景时,传统同步程序会由于等待阻塞而性能低下。
Python 提供了 asyncio 库支持协程式异步编程,可以高效地同时处理大量任务

本章将学习:

  • 协程与 async/await 语法
  • 使用 asyncio 并发执行任务
  • 异步 HTTP 请求
  • 区分并发与并行

19.2 协程基础(async / await)


19.2.1 定义和运行协程

示例:

import asyncio

async def say_hello():
    print("Hello ...")
    await asyncio.sleep(1)
    print("World!")

asyncio.run(say_hello())

✅ 输出:

Hello ...
(1秒后)
World!

async def 定义协程,await 等待其他协程完成。


19.2.2 多任务并发

示例:

import asyncio

async def task(name):
    print(f"{name} 开始")
    await asyncio.sleep(1)
    print(f"{name} 完成")

async def main():
    # 并发执行三个任务
    await asyncio.gather(
        task("任务1"),
        task("任务2"),
        task("任务3")
    )

asyncio.run(main())

✅ 三个任务会几乎同时开始,而不是顺序等待。


19.3 asyncio 高级用法


19.3.1 创建 Task 对象

示例:

import asyncio

async def work(n):
    await asyncio.sleep(1)
    print(f"工作 {n} 完成")

async def main():
    tasks = [asyncio.create_task(work(i)) for i in range(5)]
    await asyncio.gather(*tasks)

asyncio.run(main())

create_task() 可立即调度任务而无需等待。


19.3.2 异步队列(Queue)

示例:

import asyncio

async def producer(q):
    for i in range(3):
        await q.put(i)
        print("生产", i)

async def consumer(q):
    while True:
        item = await q.get()
        print("消费", item)
        q.task_done()

async def main():
    q = asyncio.Queue()
    asyncio.create_task(consumer(q))
    await producer(q)
    await q.join()

asyncio.run(main())

✅ 常用于生产者-消费者模型


19.4 异步 HTTP 请求


同步 HTTP 请求会阻塞线程,但可以用 aiohttp 库实现异步:

安装:

pip install aiohttp

示例:

import aiohttp
import asyncio

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

async def main():
    urls = ["https://httpbin.org/get"] * 5
    async with aiohttp.ClientSession() as session:
        tasks = [fetch(session, url) for url in urls]
        results = await asyncio.gather(*tasks)
        print("共获取到", len(results), "个响应")

asyncio.run(main())

✅ 所有请求会并发发送,极大提高效率。


19.5 并发 vs 并行

术语

概念

实现方式

并发 (Concurrency)

多个任务交替执行,共享一个CPU

asyncio / 协程

并行 (Parallelism)

多个任务同时执行,使用多个CPU核

multiprocessing 多进程

asyncio 是并发,不是并行。计算密集型任务提议用多进程。


19.6 小结

技术

用途

async/await

定义协程式异步函数

asyncio.gather

并发运行多个协程

aiohttp

异步 HTTP 请求

Queue(异步)

实现生产者-消费者模型

✅ 掌握异步编程可以让你构建高性能网络应用、爬虫、I/O密集型程序

  • 全部评论(0)
最新发布的资讯信息
手机二维码手机访问领取大礼包
返回顶部