文章目录
专栏列表
- Python教程(十):面向对象编程(OOP)
- Python教程(十一):单元测试与异常捕获
- Python教程(十二):面向对象高级编程详解
- Python教程(十三):常用内置模块详解
- Python教程(十四):Requests模块详解
- Python教程(十五):IO 编程
- Python教程(十六):进程、线程、线程锁
正文开始
,如果觉得文章对您有帮助,请帮我三连+订阅,谢谢
💖💖💖
在现代编程中,异步 IO 已经成为提高程序性能和响应能力的关键技术之一。Python 通过
asyncio
库提供了强大的异步编程支持,而aiohttp
库则使得异步 HTTP 请求变得简单。本文将详细介绍 Python 中的异步 IO,包括asyncio
、协程以及aiohttp
的使用。
1. 异步 IO 的基本概念
1.1 同步与异步
-
在传统的
同步 IO
模型中,当一个操作(如读写文件或网络请求)正在进行时,程序会阻塞
,直到操作完成。这在处理大量并发请求时会导致效率低下。 -
异步 IO
则允许程序在等待一个操作完成时继续执行其他任务。这种非阻塞的方式大大提高了程序的并发处理能力
。
1.2 协程
- 协程是实现异步编程的一种机制,
它允许挂起和恢复执行
,而不需要将控制权交给操作系统。 - 在 Python 中,协程可以通过
async
和await
关键字来定义和调用。
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 事件,以及执行定时任务等。事件循环会按照以下步骤运行:
- 任务调度:协程(coroutine)被创建并调度到事件循环中。
- 执行任务:事件循环从任务队列中取出协程并执行。
- 等待 IO:如果协程进行 IO 操作,事件循环会挂起当前协程,并执行其他任务。
- 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
的特点:
- 异步读写:支持异步读取和写入文件,不会阻塞事件循环。
- 兼容
asyncio
:与asyncio
库无缝集成,可以与其他异步操作一起使用。 - 简单的 API:提供了一个简单直观的 API,使得异步文件操作类似于同步操作。
- 自动资源管理:使用
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 程序性能的强大工具。通过 asyncio
和 aiohttp
,你可以构建高效、可扩展的异步应用程序。使你在处理高并发场景时更加得心应手。