Asyncio执行流程问题

2024-01-30

我对 python 中的 asyncio 有点陌生。我试图运行这个简单的代码,但我不知道为什么我会得到这个意外的输出。

我所做的是,在outer函数,我创建了异步任务并将其存储在数组中tasks。在等待这些任务之前,我写了一条打印语句print("outer")应该在每次迭代中运行。在任务中我写了另一个打印语句print("inner") in inner功能。但我如何得到一些意想不到的输出。

这是代码 -

import asyncio


def main():
    loop = asyncio.get_event_loop()
    loop.run_until_complete(outer(loop))
    loop.close()


async def outer(loop):
    tasks = []
    for i in range(0, 5):
        tasks.append(loop.create_task(inner()))

    for task in tasks:
        print("outer")
        await task


async def inner():
    print("inner")
    await asyncio.sleep(0.5)

if __name__ == '__main__':
    main()

这是输出 -

outer
inner
inner
inner
inner
inner
outer
outer
outer
outer

我的预期输出是 -

outer
inner
outer
inner
outer
inner
outer
inner
outer
inner

为什么所有的inner之前正在打印outer。 asyncio的正确执行流程是怎样的?提前致谢。


In async def outer(loop)

for i in range(0, 5):
    tasks.append(loop.create_task(inner()))
  • 五新inner任务已创建、计划并开始运行。
  • 事件循环运行计划任务直到完成。

如果你再添加一点inner and outer它更好地展示了这个过程:

async def outer(loop):
    tasks = []
    for i in range(0, 5):
        tasks.append(loop.create_task(inner(i)))
    await asyncio.sleep(3)
    for task in tasks:
        print('outer')
        await task

async def inner(n):
    print(f"inner {n} start")
    await asyncio.sleep(0.5)
    print(f'inner {n} end')
  • while outer在睡觉

    • 第一个任务runs到它的等待语句
    • 事件循环暂停第一个任务的执行
    • 事件循环runs下一个计划任务直到其await语句
    • 这种情况一直持续到每个任务都有机会运行到其await 语句为止,然后事件循环开始四处查看是否有任何任务已完成等待它们正在等待的任何任务 - 如果完成,它会让它们运行更多。
    • 这一直持续到所有任务完成
  • 您可以看到这五个任务在第二个 for 循环开始之前就执行并完成了。

  • 在第二个 for 循环中,每个任务已经完成,所以await task没有什么可等待的outer连续打印五次。

我对控制一切的事件循环有点模糊 - 我没有找到任何明确的文档 - 可能在create_task docs: Wrap the coro coroutine into a Task and schedule its execution.当您创建任务时,它就会被安排。我在 pyvideo.org 上看过显示该过程的视频,不幸的是我无法快速找到我想要链接的视频。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Asyncio执行流程问题 的相关文章

随机推荐

  • 如何在 WCF 服务上设置密码?

    我正在开发一个 WCF 服务 我们的其他软件调用该服务将错误信息发送到我们的数据库 问题是 由于它是在线服务 所以它不安全 所以我想知道该服务是否可以请求密码 即当我们调用该服务时 我们必须配置密码或类似的东西 我用谷歌搜索了一下 但对于这
  • 尾递归Map函数RACKET

    Racket 中的映射函数采用一个函数和一个列表 并将该函数递归地应用于列表中的每个项目 我正在尝试将映射转换为尾递归函数 这该如何完成 你被困在哪里了 您可以定义自己的map程序与内部loop程序 define map f in defi
  • 如何在 Jetpack Compose for Desktop 中使用 .svg 文件?

    我正在尝试使用 svg 矢量文件 来显示图像 但我被卡住了 无法做到这一点 有什么办法可以使用它 我尝试像这样使用它 Image imageFromResource svg file name svg contentDescription
  • OpenCV 中从 3D 点构建平面

    我想从 OpenCV 中的 3D 点列表构造一个平面 我想通过查找以下形式的四个参数来获得结果 Ax By Cz D 0 有人会建议我一种方法吗 如果数据不包含异常值且不包含多个平面 此外 所有点都恰好位于一个平面上 数据没有噪声 就这么简
  • 将字典转换为元组列表

    如何以最短的方式将字典转换为元组列表 C Dictionary
  • 达到 MaxLength 时 XAML 触发自动制表符

    当 MaxLength 属性到达 XAML 触发器 DataTrigger PropertyTrigger Style Trigger 等时 如何合并自动制表符 下面是两个这样的选项 说明我如何通过代码隐藏使用 TextBox 完成此操作
  • Spring Boot RabbitMQ 接收器 Jackson 反序列化为 POJO

    我有一个 Spring Boot 项目 我正在尝试与 RabbitMQ 服务器集成 以便我可以向队列发布消息和从队列读取消息 这是我的rabbitmq配置 编辑后仅显示相关详细信息 Configuration ConfigurationPr
  • 运行 NestJS 应用程序时如何查看 console.log 输出?

    我正在构建我的第一个 NestJS 应用程序 我在他们的文档中看到很多使用 console log 的示例 但是当我添加它时 终端中没有输出 我正在使用 vscode 的终端 我还尝试使用内置 Logger 并使用 npm run star
  • MySQL 5.1 在存在索引时使用 filesort 事件

    也许我错过了一些愚蠢的事情 显然 即使有一个索引与 ORDER BY 子句中的列完全匹配 MySQL 5 1 也会继续执行文件排序 为了将其发布在这里 我过度简化了数据模型 但问题仍然发生 表定义 CREATE TABLE event id
  • 日期选择器对话框阴影的白色背景

    我将 datepicker 添加到我的应用程序中 但我的问题是对话框的阴影有白色背景 使用 Android 21 进行编译 请帮我删除白色背景 我有同样的问题 我所做的第一个解决方案 我最终在 DatePickerDialog 构建器中给出
  • 如何将宏与金字塔/ZPT(变色龙)一起使用

    我想将宏与金字塔 ZPT引擎 Chameleon 一起使用 文档说 单个页面模板可以容纳多个宏 http chameleon readthedocs org en latest reference html macros metal htt
  • Shell 脚本中的 REGEX 测试始终为 False

    这个正则表达式总是在 shell 脚本中检查false尽管它匹配 LIST values usr bin env bash LIST AB CD EF Valid value and should print VALID if LIST A
  • 在实体管理器上使用 unwrap 方法获取本机休眠会话后,我是否必须关闭两者?

    我有看起来像这样的代码 this entityManager AppFactory instance getEntityManagerFactory createEntityManager this hibernateSession ent
  • 来自不同客户端的 EJB3 有状态并发调用

    我有一个富客户端 swing 应用程序调用远程有状态 ejb 我使用的是JBoss 6 0 我已经将客户端部署在两台不同的机器上 即不同的IP地址 jvm等 有状态的有以下代码 Stateful public class MyStatefu
  • 如何在Windows身份验证中传递URL中的特殊字符?

    要处理 Windows 身份验证 处理这种情况的一种方法是在 URL 本身中传递凭据 如下所示 driver get http username email protected cdn cgi l email protection 但就我而
  • 边框的外发光效果

    如何给边框提供外发光效果
  • AWS Glue 中的 AWS 区域

    如何获取当前 Glue 作业正在执行的区域 当 Glue 作业开始执行时 我看到输出 Detected region eu central 1 在 AWS Lambda 中 我可以使用以下行来获取当前区域 import os region
  • 子类化 C# System.Type 的最简单方法

    我需要使定点数类继承自System Type class FixedPoint Type public bool Signed get set public int Width get set public int IntegerWidth
  • 如何重置 jQuery UI 滑块?

  • Asyncio执行流程问题

    我对 python 中的 asyncio 有点陌生 我试图运行这个简单的代码 但我不知道为什么我会得到这个意外的输出 我所做的是 在outer函数 我创建了异步任务并将其存储在数组中tasks 在等待这些任务之前 我写了一条打印语句prin