在Python中,asyncio
是一个用于编写单线程并发代码的库,使用 async/await
语法。它主要用于I/O密集型任务,如网络请求、文件读写等。通过事件循环(event loop),asyncio
可以实现高效的异步I/O操作。
async def
定义的函数,返回一个协程对象。协程可以在遇到 await
时暂停执行,等待异步操作完成后再继续执行。asyncio
的核心,负责调度和执行协程、处理I/O事件、执行回调等。Future
对象通常由事件循环创建,并且可以通过 await
来等待它的完成。Future
的子类,用于包装协程并在事件循环中调度执行。asyncio
实现异步I/O以下是一个简单的示例,展示了如何使用 asyncio
实现异步I/O操作:
import asyncio
async def fetch_data():
print("开始获取数据...")
await asyncio.sleep(2) # 模拟I/O操作,如网络请求
print("数据获取完成")
return {"data": 123}
async def main():
print("主函数开始")
result = await fetch_data()
print(f"获取到的数据: {result}")
print("主函数结束")
# 运行事件循环
asyncio.run(main())
asyncio
允许你并发执行多个任务,从而提高效率。可以使用 asyncio.gather
或 asyncio.create_task
来实现。
import asyncio
async def fetch_data(task_id, delay):
print(f"任务 {task_id} 开始获取数据...")
await asyncio.sleep(delay) # 模拟I/O操作
print(f"任务 {task_id} 数据获取完成")
return {f"data_from_task_{task_id}": 123}
async def main():
# 并发执行多个任务
results = await asyncio.gather(
fetch_data(1, 2),
fetch_data(2, 1),
fetch_data(3, 3),
)
print(f"所有任务完成,结果: {results}")
# 运行事件循环
asyncio.run(main())
asyncio.create_task
asyncio.create_task
用于显式地创建一个任务并将其调度到事件循环中。
import asyncio
async def fetch_data(task_id, delay):
print(f"任务 {task_id} 开始获取数据...")
await asyncio.sleep(delay) # 模拟I/O操作
print(f"任务 {task_id} 数据获取完成")
return {f"data_from_task_{task_id}": 123}
async def main():
# 创建任务
task1 = asyncio.create_task(fetch_data(1, 2))
task2 = asyncio.create_task(fetch_data(2, 1))
task3 = asyncio.create_task(fetch_data(3, 3))
# 等待任务完成
result1 = await task1
result2 = await task2
result3 = await task3
print(f"任务1结果: {result1}")
print(f"任务2结果: {result2}")
print(f"任务3结果: {result3}")
# 运行事件循环
asyncio.run(main())
在异步编程中,异常处理同样重要。可以使用 try/except
来捕获和处理异常。
import asyncio
async def fetch_data(task_id, delay):
try:
print(f"任务 {task_id} 开始获取数据...")
await asyncio.sleep(delay) # 模拟I/O操作
if task_id == 2:
raise ValueError("任务2出错")
print(f"任务 {task_id} 数据获取完成")
return {f"data_from_task_{task_id}": 123}
except Exception as e:
print(f"任务 {task_id} 出错: {e}")
return None
async def main():
results = await asyncio.gather(
fetch_data(1, 2),
fetch_data(2, 1),
fetch_data(3, 3),
return_exceptions=True # 捕获异常并返回
)
print(f"所有任务完成,结果: {results}")
# 运行事件循环
asyncio.run(main())
asyncio
进行网络请求asyncio
通常与 aiohttp
库结合使用,以进行异步HTTP请求。
import asyncio
import aiohttp
async def fetch_url(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.text()
async def main():
urls = [
"https://example.com",
"https://example.org",
"https://example.net",
]
tasks = [fetch_url(url) for url in urls]
results = await asyncio.gather(*tasks)
for url, content in zip(urls, results):
print(f"URL: {url}, 内容长度: {len(content)}")
# 运行事件循环
asyncio.run(main())
asyncio
是Python中实现异步I/O的强大工具,特别适合处理I/O密集型任务。async/await
语法,可以编写清晰、易读的异步代码。asyncio.gather
或 asyncio.create_task
可以并发执行多个任务,提高效率。aiohttp
)来实现。通过合理使用 asyncio
,你可以编写出高效的异步I/O程序,充分利用系统资源,提升应用程序的性能。