asyncio中await关键字的理解

这篇具有很好参考价值的文章主要介绍了asyncio中await关键字的理解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在 asyncio 中,await 关键字用于暂停当前异步函数的执行,直到其后的协程(coroutine)完成执行并返回结果。一旦协程完成,await 表达式会返回该协程的结果,并且异步函数会从这个点继续执行。

多个 await 表达式会按照它们在代码中的顺序依次执行。这意味着,如果在一个异步函数中有多个 await 表达式,第一个 await 会暂停函数执行,等待其后的协程完成,然后继续执行到下一个 await,依此类推。

import asyncio  
  
async def fetch_data(url):  
    # 模拟网络请求,这里使用 asyncio.sleep 代替  
    await asyncio.sleep(1)  
    return f"Data from {url}"  
  
async def main():  
    # 同时发起两个异步请求  
    data1 = await fetch_data("https://api.example.com/data1")  
    print(data1)  
    data2 = await fetch_data("https://api.example.com/data2")  
    print(data2)  
  
# 运行异步主函数  
asyncio.run(main())

上面的示例代码中,当 main 函数执行到第一个 await fetch_data("https://api.example.com/data1") 时,它会暂停,等待 fetch_data 协程完成。此时,事件循环会查找并执行其他挂起的任务。如果没有其他任务可以执行(比如其他由 asyncio.run() 或 asyncio.gather() 等启动的协程),事件循环会阻塞,直到 fetch_data 协程完成。

main 函数内部有两个 await 表达式,分别对应于两次 fetch_data 的调用。当第一个 await 暂停 main 函数时,事件循环不会执行 main 函数内部的第二个 await,因为第二个 await 属于 main 函数的一部分,并且只有当第一个 await 完成(即第一个 fetch_data 调用完成)后,控制权才会返回到 main 函数,从而执行第二个 await

一旦 fetch_data 协程完成,控制权会返回到 main 函数,并且继续执行到下一个 await 表达式。此时,main 函数会再次暂停,等待第二个 fetch_data 调用完成。同样,在这个过程中,事件循环会检查并执行其他可用的任务。

总结来说,当第一个 await 暂停时,事件循环不会执行 main 函数内部的第二个 await,而是会等待第一个 await 对应的协程完成,然后回到 main 函数并执行第二个 await。如果在此期间没有其他任务可以执行,事件循环可能会阻塞,直到有任务可以执行或当前协程完成。文章来源地址https://www.toymoban.com/news/detail-832958.html

到了这里,关于asyncio中await关键字的理解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • this关键字和同步异步宏认为微任务理解

    目录 js面试常见问题:1.this指向  2.闭包定义和作用 3.原型链 4.异步协程 this this主要有以下几个使用场合。 1)全局环境 (2)构造函数 (3)对象的方法 避免多层this 避免数组处理方法中的 this 避免回调函数中的 this 绑定 this 的方法 Function.prototype.call() Function.prototype

    2024年02月15日
    浏览(49)
  • 深入理解C++中的静态(Static)关键字及其应用场景

    在C++中,静态(Static)是一个常见且重要的概念,用于描述变量、函数和类成员。它具有独特的特性和作用域,可以在不同的应用场景中发挥重要作用。本文将详细讨论C++中的静态,包括静态变量、静态函数和静态类成员,并对其与全局变量之间的区别进行分析

    2024年02月09日
    浏览(49)
  • 深入理解C#泛型:new与where关键字全解析

    C#泛型中new和where是重要的,它们都可以用于约束泛型类型参数的限制;它们都用于提高代码的安全性和可用性,它们的作用在很大程度上提高了代码的可读性和可维护性。在这篇文章中,我们将一起了解泛型中的new和where,以及它们之间的区别。 1. new 在C#泛型中

    2023年04月25日
    浏览(38)
  • 【C语言】理解最快的关键字:register 和 寄存器的地位

    register int a = 10; 被register修饰的变量会被***建议***存放在寄存器中,但只是建议,主要还是由操作系统决定。 寄存器是一种造价很高、读写速度很快的存储设备。 存储设备 空间大小 寄存器(regs) 4byte,CPU通常集成几十个寄存器 高速缓存(cache) 128M,CPU通常集成集成多个高

    2024年02月06日
    浏览(49)
  • 全面理解java中的构造方法以及this关键字的用法(超详细)

    Hello,各位铁汁们!我是小🐟儿哈!今天我又来更新我的Java基础学习博客了。 本篇主要内容概述: 1、🍚如何用构造方法初始化对象 2、🍚为啥要有this这个 3、🍚this.属性名访问成员变量、成员方法 4、🍚this.方法名 || this.()的用法 目录 初识构造方法  构造方法的使

    2023年04月09日
    浏览(62)
  • this 之谜揭底:从浅入深理解 JavaScript 中的 this 关键字(二)

    系列首发于公众号『前端进阶圈』 ,若不想错过更多精彩内容,请“星标”一下,敬请关注公众号最新消息。 调用位置 在理解 this 的绑定过程之前,首先要理解 调用位置 : 调用位置就是函数在代码中被调用的位置(而不是声明的位置) 。 通常来说,寻找调用位置就是寻找

    2024年02月08日
    浏览(48)
  • 【C语言深度剖析——第三节(关键字3)】《C语言深度解剖》+蛋哥分析+个人理解

    本文由@睡觉待开机原创,未经允许不得转载。 本内容在csdn网站首发 欢迎各位点赞—评论—收藏 如果存在不足之处请评论留言,共同进步! 前言: 本期我们继续探讨关于C深度解剖这本书相关内容,继上一篇博客,本篇博客来围绕“数据类型”、“原反补”有关话题进行探

    2024年01月21日
    浏览(43)
  • 【C语言深度剖析——第四节(关键字4)】《C语言深度解剖》+蛋哥分析+个人理解

    追求本质,不断进步 本文由@睡觉待开机原创,转载请注明出处。 本内容在csdn网站首发 欢迎各位点赞—评论—收藏 如果存在不足之处请评论留言,共同进步! 前言: 本节博客继续前篇内容进行续写,我们着重探求有符号与无符号数的问题,探求 整形在内存中的存储 这一课

    2024年01月20日
    浏览(45)
  • 用python实现给出关键字查找并标注pdf文件中关键字

    要在Python中标注PDF文件中的,可以使用Python的PDFMiner库和Python的matplotlib库。 首先,需要安装这两个库。可以使用pip命令进行安装: shell 复制代码 pip install pdfminer.six matplotlib 接下来,可以使用以下代码实现查找和标注功能: python 复制代码 import pdfminer   from pdf

    2024年01月16日
    浏览(71)
  • Python | assert关键字

    Python断言assert是帮助代码流畅的调试工具。断言主要是假设程序员知道或总是希望是真的,因此将它们放在代码中,这样这些失败不会允许代码进一步执行。 简单地说,断言是一个布尔表达式,用来检查语句是True还是False。如果语句为True,则不执行任何操作并继续执行,但

    2024年02月11日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包