python - 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 天才能发送命令。
如何让任务在后台等待并同时向机器人发送命令?提前致谢。
解决方案
我实际上设法解决了这个问题。该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
如果你不这样做,代码不会给你任何错误,但它不会工作。
推荐阅读
- python - 在一个窗口中使用两个 FigureCanvasTkAgg
- javascript - if (typeof myFunction !== 'function') - 为什么它在 Safari 中不起作用?
- c++ - 为什么我不能在朋友类中实例化一个构造函数是私有的类?
- python - 如何在不打开文件的情况下查找和重命名excel文件的内容?
- xml - 使用 clojure.data.xml 解析 XML。如何在“解析”期间从 :content 中省略“\n”项
- jquery - 页面刷新后保持类切换
- c# - 显示弹出窗口时如何防止 IME 输入切换?
- javascript - 如果选中收音机,如何包含 php 文件
- ios - Firebase query is not populating array for table view. How can I resolve this issue?
- c# - C# windows 窗体在 datagridview 中显示 0,其中按小时分组的数据,但 SQL 开发人员显示正确的结果