Python教程(十七):协程、 asyncio与 aiohttp【异步IO】

专栏列表


在这里插入图片描述

正文开始如果觉得文章对您有帮助,请帮我三连+订阅,谢谢💖💖💖


在现代编程中,异步 IO 已经成为提高程序性能和响应能力的关键技术之一。Python 通过 asyncio 库提供了强大的异步编程支持,而 aiohttp 库则使得异步 HTTP 请求变得简单。本文将详细介绍 Python 中的异步 IO,包括 asyncio、协程以及 aiohttp 的使用。

1. 异步 IO 的基本概念

1.1 同步与异步

  • 在传统的同步 IO 模型中,当一个操作(如读写文件或网络请求)正在进行时,程序会阻塞,直到操作完成。这在处理大量并发请求时会导致效率低下。

  • 异步 IO 则允许程序在等待一个操作完成时继续执行其他任务。这种非阻塞的方式大大提高了程序的并发处理能力

1.2 协程

  • 协程是实现异步编程的一种机制,它允许挂起和恢复执行,而不需要将控制权交给操作系统。
  • 在 Python 中,协程可以通过 asyncawait 关键字来定义和调用。

1.3 asyncio

  • 异步 IO(Input/Output)在 Python 中通常通过 asyncio 库来实现, 通过 asyncio.run( fn ) 来运行异步函数

1.4 aiohttp

  • aiohttp 是一个基于异步 I/O 的 Web 框架,它专注于提供高性能、低开销的异步 Web 服务。它允许我们同时处理大量并发请求,而不会阻塞程序执行。
  • aiohttp 使用 Python 的 async/await 语法来实现异步编程,这使得编写异步代码更加直观和简洁

2. 携程

2.1 定义协程

使用 async def 定义一个协程:

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

2.2 运行协程

使用 asyncio.run() 来运行协程:

asyncio.run(my_coroutine())

3. asyncio

  • Python 的异步编程库 , asyncio 是 Python 标准库的一部分,无需额外安装
  • asyncio 通过事件循环来管理协程的执行。事件循环负责调度协程的执行,处理 IO 事件等。
  • 你可以使用asyncio.gather来并发运行多个异步任务。

3.1 事件循环解释

asyncio 中,事件循环(Event Loop)是异步编程的核心。它负责管理和执行异步任务,处理 IO 事件,以及执行定时任务等。事件循环会按照以下步骤运行:

  1. 任务调度:协程(coroutine)被创建并调度到事件循环中。
  2. 执行任务:事件循环从任务队列中取出协程并执行。
  3. 等待 IO:如果协程进行 IO 操作,事件循环会挂起当前协程,并执行其他任务。
  4. IO 完成:当 IO 操作完成时,之前挂起的协程会被重新调度执行。
  5. 处理完成:协程执行完毕后,事件循环会处理下一个任务。

下面是一个简化的事件循环的流程图:

有待执行的协程
无待执行的协程
开始
创建协程
调度协程到事件循环
事件循环
执行协程
结束事件循环
是否遇到 IO 操作
挂起协程,执行其他任务
IO 操作完成
恢复挂起的协程
结束

从上面这个在这个流程图中,我们可以看到事件循环不断地在执行协程和处理 IO 操作之间切换,直到所有的协程都被执行完毕,事件循环才会结束。这种机制使得 asyncio 能够在单线程内实现高效的并发执行。

3.2 获取文件示例

# 直接导入
import asyncio

async def read_file(file_name):
    async with aiofiles.open(file_name, mode='r') as file:
        content = await file.read()
        return content

async def main():
    file_name = 'foo.txt'
    content = await read_file(file_name)
    print(content)

# 运行主函数
asyncio.run(main())

3.2 并发获取文件示例

aiofiles 是一个 Python 库,它提供了异步文件操作的接口。它允许你在异步程序中以非阻塞的方式打开、读取、写入和关闭文件。这对于使用 asyncio 进行异步编程的开发者来说非常有用,因为它避免了传统同步文件操作可能带来的性能瓶颈。

aiofiles 的特点:

  1. 异步读写:支持异步读取和写入文件,不会阻塞事件循环。
  2. 兼容 asyncio:与 asyncio 库无缝集成,可以与其他异步操作一起使用。
  3. 简单的 API:提供了一个简单直观的 API,使得异步文件操作类似于同步操作。
  4. 自动资源管理:使用 async with 语句可以自动管理文件的打开和关闭,确保文件在操作完成后正确关闭。

安装 aiofiles 非常简单,你可以使用 pip 来安装:

pip install aiofiles

aiofiles 是处理异步文件操作的有用工具,特别是在需要高性能和高并发的应用程序中。

并发读取多个文件代码示例

import asyncio
import aiofiles

async def read_file(file_name):
    async with aiofiles.open(file_name, mode='r') as file:
        content = await file.read()
        return content

async def main():
    tasks = [read_file(f'file{i}.txt') for i in range(1, 4)]
    contents = await asyncio.gather(*tasks)
    for content in contents:
        print(content)

# 运行主函数
asyncio.run(main())

4. aiohttp:异步 HTTP 客户端/服务器

4.1 安装 aiohttp

aiohttp 是一个第三方库,可以通过 pip 安装:

pip install aiohttp

4.2 异步 HTTP 请求

使用 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():
    async with aiohttp.ClientSession() as session:
        html = await fetch(session, 'http://python.org')
        print(html)

asyncio.run(main())

4.3 异步 HTTP 服务器

使用 aiohttp 创建异步 HTTP 服务器:

from aiohttp import web

async def handle(request):
    return web.Response(text="Hello, world")

app = web.Application()
app.add_routes([web.get('/', handle)])

web.run_app(app)

5. 总结

异步 IO 是提高 Python 程序性能的强大工具。通过 asyncioaiohttp,你可以构建高效、可扩展的异步应用程序。使你在处理高并发场景时更加得心应手。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子羽bro

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值