Python asyncio 核心原理与高阶应用全解析

更新时间:2026-10-10 09:59:32 来源:本站整理 浏览:0

1. asyncio 基础

asyncio 是 Python 3.4 及以上版本引入的异步 I/O 框架,它允许开发者编写异步代码,从而显著提升程序的并发性能。通过事件循环和协程机制,asyncio 使得 I/O 密集型任务能够高效运行。

import asyncio

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

# 运行异步函数
asyncio.run(main())

2. 高级 asyncio 技巧

2.1 任务管理

使用 asyncio.create_task 可以创建独立的任务,实现并发执行。以下示例展示了如何创建并等待多个任务完成。

import asyncio

async def task1():
    await asyncio.sleep(1)
    print("Task 1 completed")
    return "Task 1 result"

async def task2():
    await asyncio.sleep(2)
    print("Task 2 completed")
    return "Task 2 result"

async def main():
    # 创建任务
    task1_obj = asyncio.create_task(task1())
    task2_obj = asyncio.create_task(task2())

    # 等待任务完成
    result1 = await task1_obj
    result2 = await task2_obj
    print(f"Results: {result1}, {result2}")

asyncio.run(main())

2.2 并发执行

asyncio.gather 可以同时运行多个协程并收集结果,是并发执行任务的高效方式。

import asyncio

async def fetch_data(id):
    await asyncio.sleep(1)
    return f"Data {id}"

async def main():
    # 并发执行多个任务
    results = await asyncio.gather(
        fetch_data(1),
        fetch_data(2),
        fetch_data(3)
    )
    print(f"Results: {results}")

asyncio.run(main())

2.3 超时处理

通过 asyncio.wait_for 可以设置操作超时,避免任务无限期等待。

import asyncio

async def slow_operation():
    await asyncio.sleep(2)
    return "Operation completed"

async def main():
    try:
        # 设置超时
        result = await asyncio.wait_for(slow_operation(), timeout=1)
        print(f"Result: {result}")
    except asyncio.TimeoutError:
        print("Operation timed out")

asyncio.run(main())

2.4 事件循环

事件循环是 asyncio 的核心,负责调度协程和执行异步任务。以下代码展示了如何手动获取和运行事件循环。

import asyncio

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

# 获取事件循环
loop = asyncio.get_event_loop()
# 运行协程
loop.run_until_complete(main())
# 关闭事件循环
loop.close()

3. 实际应用场景

3.1 网络请求

结合 aiohttp 库,asyncio 可以高效处理并发 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://api.github.com",
        "https://api.example.com",
        "https://api.google.com"
    ]
    # 并发请求
    tasks = [fetch_url(url) for url in urls]
    results = await asyncio.gather(*tasks)
    for url, result in zip(urls, results):
        print(f"URL: {url}, Length: {len(result)}")

asyncio.run(main())

3.2 文件 I/O

使用异步文件操作可以避免阻塞事件循环,提升 I/O 密集型应用的性能。

import asyncio

async def read_file(filename):
    async with open(filename, 'r') as f:
        content = await f.read()
    return content

async def write_file(filename, content):
    async with open(filename, 'w') as f:
        await f.write(content)

async def main():
    # 读取文件
    content = await read_file('input.txt')
    print(f"Read content: {content}")
    # 写入文件
    await write_file('output.txt', content.upper())
    print("File written")

asyncio.run(main())

3.3 数据库操作

借助 asyncpg 等异步驱动,asyncio 可以高效执行数据库查询。

import asyncio
import asyncpg

async def main():
    # 连接数据库
    conn = await asyncpg.connect(
        host='localhost',
        port=5432,
        user='postgres',
        password='password',
        database='test'
    )
    # 执行查询
    rows = await conn.fetch('SELECT * FROM users')
    for row in rows:
        print(row)
    # 关闭连接
    await conn.close()

asyncio.run(main())

3.4 Web 服务器

基于 aiohttp 的 Web 服务器可以充分利用 asyncio 的异步特性,处理高并发请求。

import asyncio
from aiohttp import web

async def handle(request):
    name = request.match_info.get('name', "Anonymous")
    return web.Response(text=f"Hello, {name}!")

async def main():
    app = web.Application()
    app.add_routes([
        web.get('/', handle),
        web.get('/{name}', handle)
    ])
    runner = web.AppRunner(app)
    await runner.setup()
    site = web.TCPSite(runner, 'localhost', 8080)
    await site.start()
    print("Server started on http://localhost:8080")
    await asyncio.Event().wait()

asyncio.run(main())

4. 最佳实践

  • 使用 async 和 await:定义异步函数时使用 async,等待异步操作时使用 await。
  • 使用 asyncio.create_task:创建任务以实现并发执行。
  • 使用 asyncio.gather:并发执行多个任务并收集结果。
  • 使用 asyncio.wait_for:设置超时,避免任务无限等待。
  • 使用 async with:管理异步上下文,确保资源正确释放。
  • 避免阻塞操作:在异步函数中避免使用 time.sleep() 等阻塞调用,应使用 asyncio.sleep() 替代。
  • 合理使用事件循环:根据应用场景选择合适的事件循环运行方式。

5. 总结

asyncio 是 Python 中强大的异步 I/O 框架,它允许开发者编写高效的并发代码。通过掌握 asyncio 的高级应用,我们可以构建更加高效、响应迅速的应用程序。

在实际应用中,asyncio 可广泛应用于网络请求、文件 I/O、数据库操作和 Web 服务器等多种场景,显著提升应用程序的并发性能和响应速度。

希望本文对理解和应用 Python asyncio 有所帮助。

原文链接:本站整理

本文来自互联网用户投稿,该文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 service@2cto.cc 进行投诉反馈,一经查实,立即处理!