异步计时器函数在调用两次时会阻塞自身

2024-09-29 20:30:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在尝试为我的Discord Bot实现一个功能,我可以在设置的秒数后轻松删除发送的消息

以下是我的功能:

async def messageCountdown(context, message, counter):

    response = await context.send(f"**{'—' * counter}** \n {message}")

    for i in range(counter, 0, -1):
        await response.edit(content=f"**{'—' * i}** \n {message}")
        await asyncio.sleep(1)
    
    await context.message.delete()
    await response.delete()

函数调用:

@client.command()
async def test(context, *message):
    await messageCountdown(context, "Test", 10)

如果只调用一次,函数本身运行完全正常: https://gyazo.com/3b1eef9ecf8ecbe6473e8b20dfcd19d1
只要我叫它两次或更多次,倒计时就会以一种奇怪的方式前后不一致地进行:https://gyazo.com/af4b23c5831ae90d5bc5a8461a22b0d7

我再次尝试了相同的方法,但用time.sleep(1)替换了await asyncio.sleep(1),结果相同。 这就是我不知道如何继续下去的地方,因为我发现asyncio应该解决问题,但它显然没有解决问题。另外,我不明白为什么一个函数会阻止另一个函数,因为asyncio和time都不应该这样做,因为该函数是异步的(这应该正好阻止现在发生的事情,不是吗?)


Tags: 函数https功能asynciomessageasyncresponsedef
1条回答
网友
1楼 · 发布于 2024-09-29 20:30:30

这里的async函数没有问题。问题在于API速率限制不一致

您调用函数两次,因此它每秒编辑消息两次,而不是一次

一旦达到速率限制,bot会执行操作,但由于速率限制尚未更新,一旦移除速率限制,它会立即更新消息,导致消息从步骤3直接跳到步骤1,导致消息更新不一致

阅读有关Discord API速率限制的详细信息:^{}

相关问题 更多 >

    热门问题