Python关键字await例子详细介绍

2024-03-28 21:49 Python关键字await例子详细介绍已关闭评论

在 Python 中,await 关键字是异步编程的核心组成部分,与 async 关键字一起用于定义和使用异步函数与协程。以下是一个详细的 await 关键字使用例子的详细介绍:

一、异步函数与协程

首先,理解异步函数与协程的概念是使用 await 的基础。异步函数是通过在函数定义前加上 async def 关键字声明的,这类函数能够使用 await 关键字来暂停其执行,等待异步操作(如网络请求、文件 I/O 等)完成。异步函数总是返回一个 coroutine 对象,即协程。

async def asynchronous_function():
    ...

协程是一种特殊的程序组件,它可以在执行过程中暂停,并在适当的时候恢复执行。这种特性使得协程非常适合处理异步任务,因为它可以避免阻塞主线程,提高程序的并发性和响应性。

二、await 关键字的使用

await 关键字只能在异步函数内部使用,用于等待一个协程对象或支持 __await__ 协议的对象(如 asyncio.Futureasyncio.Task 或返回 Awaitable 类型的函数)完成。当遇到 await 表达式时,异步函数会暂停执行,将控制权交还给事件循环,直到等待的异步操作完成。完成后,事件循环将恢复该异步函数的执行,并将异步操作的结果(或引发的异常)传递给 await 表达式。

例子1:等待异步函数完成

假设有一个模拟网络请求的异步函数 fetch_data

async def fetch_data(url):
    # 模拟网络请求,返回请求结果
    # 实际中可能使用 aiohttp、requests-async 等库
    await asyncio.sleep(1)  # 模拟网络延迟
    return f"Data from {url}"

async def main():
    result = await fetch_data("https://example.com/api/data")
    print(result)

main 函数中,await fetch_data("https://example.com/api/data") 表达式使得程序暂停执行,等待 fetch_data 函数完成。当 fetch_data 返回时,result 被赋值为返回的数据,然后程序继续执行。

例子2:等待多个异步操作

异步函数中可以使用多个 await 表达式,以并行或串行方式等待多个异步操作完成:

async def fetch_multiple_urls(urls):
    tasks = [fetch_data(url) for url in urls]
    results = await asyncio.gather(*tasks)
    return results

async def main():
    urls = ["https://example1.com/api/data", "https://example2.com/api/data"]
    fetched_data = await fetch_multiple_urls(urls)
    for data in fetched_data:
        print(data)

在这个例子中,fetch_multiple_urls 函数使用 asyncio.gather 函数来并发地等待多个 fetch_data 协程任务完成。await asyncio.gather(*tasks) 表达式使得 fetch_multiple_urls 暂停执行,直到所有任务都完成。完成后,返回一个包含所有结果的列表。

例子3:处理异步操作的异常

await 表达式捕获并传播异步操作中发生的异常:

async def fetch_data(url):
    try:
        response = await make_network_request(url)  # 假设这是一个抛出异常的异步操作
        return response.json()
    except NetworkError as e:
        print(f"Network error occurred: {e}")
        return None

async def main():
    data = await fetch_data("https://example.com/api/data")
    if data is not None:
        process_data(data)
    else:
        print("Failed to fetch data")

如果 make_network_request 异步操作抛出 NetworkError 异常,await 表达式会捕获该异常,并在 fetch_data 函数内部进行处理。主程序 main 中的 await fetch_data("https://example.com/api/data") 也会相应地捕获并处理这个异常,或者让其继续向上抛出。

三、总结

await 关键字在 Python 异步编程中用于暂停异步函数的执行,等待指定的异步操作完成。它使得异步代码看起来更接近于同步代码,易于理解和维护,同时保持了非阻塞性能优势。通过 await,可以轻松地在异步函数中并行或串行地执行多个异步任务,并处理它们的返回结果或异常。在实际编程中,结合 asyncio 库提供的各种工具(如 asyncio.create_taskasyncio.gatherasyncio.sleep 等),可以构建出高效、响应性强的异步应用程序。

当前文章价值8.83元,扫一扫支付后添加微信提供帮助!(如不能解决您的问题,可以申请退款)

你可能感兴趣的文章

来源:每日教程每日一例,深入学习实用技术教程,关注公众号TeachCourse
转载请注明出处: https://www.teachcourse.cn/3195.html ,谢谢支持!

资源分享

分类:python 标签:
AsyncTask==Handler+Thread对比使用说明 AsyncTask==Handler+Thread对
Android电脑局域网操作手机的工具 Android电脑局域网操作手机的工
避孕方法有哪些? 避孕方法有哪些?
Android广播注册两者方式 Android广播注册两者方式

评论已关闭!