Python asyncio 模块:必备技巧

Python asyncio 模块

asyncio 模块是 Python 标准库中的一部分,用于支持异步编程,尤其是在处理 I/O 密集型任务时,其能够显著提高程序的效率。asyncio 提供了事件循环、协程和任务,以便在单线程中实现并发的操作。自 Python 3.3 版本起引入,并在随后的版本中不断完善,因此在 Python 3.7 及以后的版本中使用更加方便 [1]

使用 asyncio 模块,开发者可以编写高效的网络应用程序、I/O 密集型处理以及其他需要并发执行的任务。通过协程,程序可以在等待 I/O 操作(如网络请求或文件读写)时,让出控制权给其他任务,从而避免资源浪费。此外,asyncio 还能够与现有的多线程和多进程库相结合,为复杂应用的开发提供更多灵活性。

asyncio 模块并不是一个额外的第三方库,而是 Python3 自带的标准库。用户只需在其 Python 环境中使用即可,无需额外安装。只要确认使用的是 Python 3.3 及以上版本,就可以直接导入使用。

用法举例

1. 示例一:基本的异步任务

1
2
3
4
5
6
7
8
9
import asyncio  # 导入asyncio模块

async def say_hello(): # 定义一个协程函数
print("Hello!") # 打印问候语
await asyncio.sleep(1) # 等待1秒,模拟I/O操作
print("Goodbye!") # 打印再见语

# 创建事件循环并运行协程
asyncio.run(say_hello()) # 运行say_hello协程,直到完成

在这个简单示例中,我们定义了一个异步函数 say_hello,它会先打印 "Hello!“,然后等待一秒钟,最后再打印"Goodbye!”。通过 asyncio.run() 运行协程时,事件循环会自动处理协程的调用与等待。

2. 示例二:并发执行多个任务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import asyncio  # 导入asyncio模块

async def count_down(number): # 定义一个协程,用来倒计时
while number > 0: # 当数字大于零时
print(number) # 打印当前数字
await asyncio.sleep(1) # 等待1秒
number -= 1 # 减少数字

async def main(): # 定义主协程
await asyncio.gather( # 使用gather并发运行多个协程
count_down(3), # 倒计时3
count_down(5) # 倒计时5
)

# 创建事件循环并运行主协程
asyncio.run(main()) # 运行主协程

这个示例演示了如何使用 asyncio.gather() 并发地执行多个协程函数。count_down() 协程会分别对输入的数字进行倒计时,通过 asyncio.gather() 可以同时运行多个任务,从而提高效率。

3. 示例三:异步 HTTP 请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import asyncio  # 导入asyncio模块
import aiohttp # 导入aiohttp模块(需要安装)

async def fetch(url): # 定义协程,用于异步获取URL内容
async with aiohttp.ClientSession() as session: # 创建异步HTTP会话
async with session.get(url) as response: # 异步GET请求
return await response.text() # 返回响应文本

async def main(): # 定义主协程
urls = ['http://example.com', 'http://example.org'] # URL列表
results = await asyncio.gather(*(fetch(url) for url in urls)) # 并发获取内容
for result in results: # 遍历结果
print(result[:100]) # 打印每个响应的前100个字符

# 创建事件循环并运行主协程
asyncio.run(main()) # 运行主协程

在这个示例中,我们使用 aiohttp 库(需要额外安装)来进行异步 HTTP 请求。通过协程 fetch() 获取 URL 的内容,并在主协程中并发地获取多个 URL 的响应。

通过以上几个例子,可以看出 asyncio 模块的强大和灵活性。它不仅可以有效地处理单个任务,还能够处理多个任务的并发执行。在实际应用中,asyncio 模块在网络爬虫、实时数据处理及 I/O 密集型应用等领域表现卓越。

强烈建议大家关注本人的博客全糖冲击博客,因为这里包含了所有 Python 标准库的使用教程,方便大家查询和学习。我的博客将为您提供丰富的实用代码示例和最佳实践,帮助您更好地掌握 Python 编程的奥秘!希望与您在编程的路上共同进步。

软件和库版本不断更新

由于软件和库版本不断更新,如果本文档不再适用或有误,请留言或联系我进行更新。让我们一起营造良好的学习氛围。感谢您的支持! - Travis Tang