【问题标题】:Is there any way to cancel asynchronous functions automatically after a specified time?有没有办法在指定时间后自动取消异步功能?
【发布时间】:2020-09-24 23:15:48
【问题描述】:

我正在尝试使用 discord.py 创建 Discord 机器人。我遇到的一个问题是我想要运行一个异步函数,但是在指定的时间量(例如 5 秒)之后,如果它还没有返回,其余的代码应该恢复并且函数应该被取消(所以它不会在那之后继续运行)。不幸的是,虽然我可以让其余的代码运行,但之后该函数继续运行。

这是一个最小的可重现示例:

import asyncio
import discord

client = discord.Client()

async def testfunc():
    await asyncio.sleep(10)
    print("Still running.")

@client.event
async def on_ready():
    print("Connected!")
    await asyncio.wait([testfunc()],timeout=5,return_when=asyncio.FIRST_COMPLETED)
    print("5 seconds up")

client.run('MY BOT ID')

我的意图是,在打印“已连接!” 5 秒后,它会打印“5 seconds up”(恢复其余代码),然后不打印“Still running”。 10 秒后。但是,当我实际尝试此操作时,两条消息都会被打印出来。

如何设置让 testfunc 在 5 秒后停止运行?

【问题讨论】:

    标签: python discord.py python-asyncio


    【解决方案1】:

    如果只需要运行一个协程,请改用wait_for

    await asyncio.wait_for(testfunc(), timeout=5)
    

    请注意,这将引发您需要捕获的 asyncio.TimeoutError

    查看wait 的文档指出:

    与 wait_for() 不同,wait() 不会在发生超时时取消期货。

    【讨论】:

      猜你喜欢
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 2020-12-06
      • 2021-02-16
      • 1970-01-01
      • 2019-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多