python库asyncio的概念和用法

python 库 asyncio

asyncio 是 Python 的标准库之一,用于编写异步应用程序。它提供了事件循环、协程、任务和其他工具来处理并发操作。以下是一些关于 asyncio 的基本概念和常见用法:

基本概念

  1. 协程 (Coroutine):

协程是一种特殊的函数,可以暂停执行并在稍后恢复。在 Python 中,协程通常通过 async def 定义。

async def my_coroutine():
    print("Hello, World!")
  1. 事件循环 (Event Loop):

事件循环是 asyncio 的核心,负责管理和调度协程。可以通过 asyncio.run() 启动事件循环。

import asyncio

async def main():
    await my_coroutine()

asyncio.run(main())
  1. 任务 (Task):

任务是协程的封装,可以在事件循环中调度和管理。可以通过 asyncio.create_task() 创建任务。

import asyncio

async def my_coroutine():
    await asyncio.sleep(1)
    print("Task completed")

async def main():
    task = asyncio.create_task(my_coroutine())
    await task

asyncio.run(main())

常见用法

  1. 并发执行多个协程:

使用 asyncio.gather() 可以并发执行多个协程,并等待所有协程完成。

import asyncio

async def my_coroutine(id):
    await asyncio.sleep(1)
    print(f"Coroutine {id} completed")

async def main():
    coroutines = [my_coroutine(i) for i in range(3)]
    await asyncio.gather(*coroutines)

asyncio.run(main())
  1. 超时控制:

使用 asyncio.wait_for() 可以设置协程的超时时间。

import asyncio

async def my_coroutine():
    await asyncio.sleep(10)
    print("This should not be printed")

async def main():
    try:
        await asyncio.wait_for(my_coroutine(), timeout=5)
    except asyncio.TimeoutError:
        print("Coroutine timed out")

asyncio.run(main())
  1. 异步 I/O 操作:

asyncio 提供了异步 I/O 操作的支持,例如 aiohttp 库可以用于异步 HTTP 请求。

import asyncio
import aiohttp

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, 'https://example.com')
        print(html)

asyncio.run(main())

异常处理

在 asyncio 中,异常处理与同步代码类似,但需要注意的是,协程中的异常需要在 await 时捕获。

import asyncio

async def my_coroutine():
    raise ValueError("An error occurred")

async def main():
    try:
        await my_coroutine()
    except ValueError as e:
        print(f"Caught an exception: {e}")

asyncio.run(main())

希望这些示例和解释能帮助你更好地理解和使用 asyncio。

posted @ 2024-11-08 17:24  weiqinl  阅读(21)  评论(0编辑  收藏  举报