首页 > 解决方案 > Python Discord Bot 计划任务阻止了其余代码

问题描述

我用 Python 构建了一个 Discord 机器人。该机器人有一些任务需要在一天中的不同时间运行,还有一些命令需要随叫随到。

@bot.command(name = "how_are_you", help = "Asks: How Are You?")
async def ask_how_are_you(ctx):
    await ctx.send("How are you?")

@tasks.loop(hours = 24)
async def say_hello():
    channel = bot.get_channel(int(CHANNEL))
    await channel.send("Hello World")

@say_hello.before_loop
async def before():
    now = datetime.datetime.now()
    start_time = datetime.datetime(now.year, now.month, now.day, 20, 00)
    delta = start_time - now
    time.sleep(delta.total_seconds())
    await bot.wait_until_ready()
    print("Finished waiting")

然后我按如下方式运行机器人:

say_hello.start()
bot.run(TOKEN)

工作原理:我想say_hello()每天 20:00 跑步。该before()函数获取当前时间并检查在 20.00 之前错过了多少秒,然后等待该秒数。问题是,在能够向机器人发送命令之前,我需要等待before()函数完成等待。这可能需要一段时间,因为如果现在是 17.00,我需要等到 20.00 才能before()完成等待。更糟糕的是,如果我有一个每周运行的任务,比如说,每个星期五@20.00,今天是星期二,我需要等待 3 天才能发送命令。

如何让任务在后台等待并同时向机器人发送命令?提前致谢。

标签: pythondiscorddiscord.pypython-asyncio

解决方案


我实际上设法解决了这个问题。该before()功能需要更改如下:

@say_hello.before_loop
async def before():
    now = datetime.datetime.now()
    start_time = datetime.datetime(now.year, now.month, now.day, 20, 00)
    delta = start_time - now
    await asyncio.sleep(delta.total_seconds()) #THIS CHANGED
    await bot.wait_until_ready()
    print("Finished waiting")

重要的是,我以前没有这样做过,要记住,import asyncio如果你不这样做,代码不会给你任何错误,但它不会工作。


推荐阅读