“发射后不管” python async/await

2024-06-28

有时需要发生一些非关键的异步操作,但我不想等待它完成。在 Tornado 的协程实现中,您可以通过简单地省略来“触发并忘记”异步函数yield关键词。

我一直在试图弄清楚如何用新的方式“发射后忘记”async/awaitPython 3.5 中发布的语法。例如,简化的代码片段:

async def async_foo():
    print("Do some stuff asynchronously here...")

def bar():
    async_foo()  # fire and forget "async_foo()"

bar()

但发生的事情是这样的bar()永远不会执行,而是我们收到运行时警告:

RuntimeWarning: coroutine 'async_foo' was never awaited
  async_foo()  # fire and forget "async_foo()"

Upd:

Replace asyncio.ensure_future with asyncio.create_task如果你使用 Python >= 3.7 则到处都是 这是一种更新、更好的方法产生任务 https://docs.python.org/3/library/asyncio-task.html#asyncio.create_task.


asyncio.Task“一劳永逸”

根据 python 文档asyncio.Task https://docs.python.org/3/library/asyncio-task.html#asyncio.Task可以启动一些协程“在后台”执行。创建的任务asyncio.ensure_future https://docs.python.org/3/library/asyncio-future.html#asyncio.ensure_future不会阻止执行(因此该函数将立即返回!)。这看起来像是您所要求的“即发即忘”的方式。

import asyncio


async def async_foo():
    print("async_foo started")
    await asyncio.sleep(1)
    print("async_foo done")


async def main():
    asyncio.ensure_future(async_foo())  # fire and forget async_foo()

    # btw, you can also create tasks inside non-async funcs

    print('Do some actions 1')
    await asyncio.sleep(1)
    print('Do some actions 2')
    await asyncio.sleep(1)
    print('Do some actions 3')


if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())

Output:

Do some actions 1
async_foo started
Do some actions 2
async_foo done
Do some actions 3

如果任务在事件循环完成后执行怎么办?

请注意,asyncio 期望任务在事件循环完成时完成。所以如果你愿意改变main() to:

async def main():
    asyncio.ensure_future(async_foo())  # fire and forget

    print('Do some actions 1')
    await asyncio.sleep(0.1)
    print('Do some actions 2')

程序完成后您将收到此警告:

Task was destroyed but it is pending!
task: <Task pending coro=<async_foo() running at [...]

为了防止这种情况,你可以等待所有待处理的任务 https://stackoverflow.com/a/27910822/1113207事件循环完成后:

async def main():
    asyncio.ensure_future(async_foo())  # fire and forget

    print('Do some actions 1')
    await asyncio.sleep(0.1)
    print('Do some actions 2')


if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())
    
    # Let's also finish all running tasks:
    pending = asyncio.Task.all_tasks()
    loop.run_until_complete(asyncio.gather(*pending))

杀死任务而不是等待它们

有时您不想等待任务完成(例如,某些任务可能会创建为永远运行)。在这种情况下,您只需cancel()他们而不是等待他们:

import asyncio
from contextlib import suppress


async def echo_forever():
    while True:
        print("echo")
        await asyncio.sleep(1)


async def main():
    asyncio.ensure_future(echo_forever())  # fire and forget

    print('Do some actions 1')
    await asyncio.sleep(1)
    print('Do some actions 2')
    await asyncio.sleep(1)
    print('Do some actions 3')


if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())

    # Let's also cancel all running tasks:
    pending = asyncio.Task.all_tasks()
    for task in pending:
        task.cancel()
        # Now we should await task to execute it's cancellation.
        # Cancelled task raises asyncio.CancelledError that we can suppress:
        with suppress(asyncio.CancelledError):
            loop.run_until_complete(task)

Output:

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

“发射后不管” python async/await 的相关文章

  • 获得熊猫按群体连续几周的最长连续记录

    目前我正在处理不同主题的每周数据 但可能会有一些没有数据的长连续 所以 我想做的就是保留每个连续几周的最长连续id 我的数据如下所示 id week 1 8 1 15 1 60 1 61 1 62 2 10 2 11 2 12 2 13 2
  • Python 解码 JSON 中的嵌套 JSON

    我正在处理一个 API 不幸的是它返回了格式错误 或 奇怪的格式 而是 感谢 fjarri JSON 但从积极的一面来看 我认为这可能是我学习一些有关递归以及JSON 这是我用来记录锻炼的应用程序 我正在尝试制作备份脚本 我可以很好地收到
  • 设置面积图 openpyxl 的透明度(alpha)

    我想使用 openpyxl 设置面积图背景的透明度 我的图表代码是 from openpyxl drawing fill import PatternFillProperties ColorChoice c2 AreaChart c2 gr
  • Ubuntu 上的 Chromedriver:selenium.common.exceptions.SessionNotCreatedException:消息:会话未创建

    我在 AWS EC2 实例 的 Ubuntu 环境中使用 Selenium Chromedriver 时遇到问题 我正在使用 Chromedriver Linux64 版本 wnload chromedriver for Linux wge
  • Python Turtle 中的 onkeypress() 和 Listen() 问题

    我的一个功能有问题 我使用 Python 3 7 当我尝试使用onkeypress 函数 什么也没有发生 我尝试检查它 但是当我按键时乌龟模块没有反应 我尝试使用 w 键向上移动桨 但这不起作用 以下是我的 py 文件 main py im
  • url 查询中的字符 %7D 意味着什么?

    如果我使用 url 访问我的 web 应用程序 vi 5907399890173952 html 然后它就可以工作了 但是当我查看日志文件时 googlebot 会尝试访问一个类似的网址 该网址会生成异常 vi 59073998901739
  • 尝试将行附加到按对象分组中的每个组时出现奇怪的行为

    这个问题是关于一个函数在应用于两个不同的数据帧时以意想不到的方式表现的 更准确地说 是 groupby 对象 要么是我遗漏了一些明显错误的东西 要么是 pandas 中存在错误 我编写了以下函数 将一行附加到 groupby 对象中的每个组
  • Tastypie:GET 的身份验证和 POST 的匿名

    我使用 Django Tastypie 来管理我的用户集合 是否可以允许匿名用户在 API 中发布 在某个端点创建新用户时 并限制经过身份验证的用户仅获取自己的用户 而不是所有用户 感谢您的帮助 我发现最简单的事情就是对我正在使用的身份验证
  • ibapi nextValidId 并不总是被调用

    我构建了一个小型 ibapi python 应用程序来运行一些策略 同时注意保持与 tws 的连接 如果 tws 处于非活动状态 python 应用程序将启动并等待 并在 tws 启动时连接到 tws 但这是我的问题 nextValidId
  • 如何在不使用pygame的情况下检测按键事件和按键按住事件

    我目前正在寻找一个能够检测 监视键盘的库 我的目的是检测何时按下某个键 以及当它发生时应该发生一些事情 大多数 SO 帖子建议使用 pygame 但我发现它有点太多了 涉及一个像这样的库来完成这个简单的任务 我也尝试过pynput 这导致只
  • 如何有效地找到两个轮廓集之间的所有交点

    我想知道找到两组轮廓线之间所有交点 舍入误差 的最佳方法 哪种方法最好 这是示例 import matplotlib pyplot as plt import numpy as np x np linspace 1 1 500 X Y np
  • 如何使用 BeautifulSoup 排除表中的某些行?

    我已经从表格中获得了所需的数据 但不想要各个玩家统计数据之间的缩写 Rk Pos Name 等 如何在保留所需数据的同时排除这些数据 包含缩写的行被归类为 thead 但我不知道如何使用该信息来跳过它 我知道玩家的数据都被压缩在一起 但现在
  • 从 FTP 服务器上的 ZIP 存档读取文件,无需下载到本地系统

    我在 FTP 服务器上的目标文件是 ZIP 文件 CSV 位于更远的两个文件夹中 我如何才能使用 BytesIO 让 pandas 读取 csv 而无需下载它 这是我到目前为止所拥有的 ftp FTP FTP SERVER ftp logi
  • 如何设置 pandas DataFrame _repr_html_ 方法的默认样式?

    我有一个 pandas DataFrame 其中有一列是 url 并且我编写了以下格式化程序以将其作为链接呈现在我的笔记本中 def make clickable val target blank to open new window re
  • 相比之下,超出了最大递归深度

    我写了这段代码来计算组合的数量 def fact n return 1 if n 1 else n fact n 1 def combinations n k return fact n fact n k fact k while True
  • Django 和 REST API 服务基于计算的请求

    我在 Django 中编写了一个机器学习应用程序 以便用户可以在表单中指定一些参数并训练模型 模型训练完成后 我想满足以下请求 curl http localhost 8000 model input XYZ 我希望 Django 返回给定
  • MySQL:进行基本搜索

    我的数据库中有一个名称表 我希望对其进行模糊搜索 例如我的数据库包含 Name ID John Smith 1 Edward Smith 2 Gabriel Gray 3 Paul Roberts 4 目前 当我通过 python 搜索数据
  • 检查Python multiprocessing.Connection 的实例吗?

    Connection对象是在打开时创建的multiprocessing Pipe 然而 尚不清楚如何检查一个对象是否是一个实例Connection 在Python3 3 4 3 3 3 2 中 检测Connection我可以 from mu
  • Python:正则表达式 findall

    我使用 python 正则表达式从给定字符串中提取某些值 这是我的字符串 mystring txt sometext somemore text here some other text course course1 Id Name mar
  • 命名空间与常规包

    命名空间 Python 包之间有什么区别 没有 init py 和一个常规的Python包 有一个 init py 特别是当 init py普通包裹是空的吗 我很好奇 因为最近我忘记了 init py在我制作的包中 我从未注意到任何问题 事

随机推荐