【问题标题】:Carry bots tasks out over restarts and shutdowns在重启和关机时执行机器人任务
【发布时间】:2021-08-09 12:20:05
【问题描述】:

我在 discord 中有一个简单的 python 机器人。

假设我的代码如下:

@client.command(pass_context=True)
async def test(ctx):
  await asyncio.sleep(500)
  await ctx.send("Hello!")

此代码将让机器人等待 500 秒,然后在聊天中发送“你好!

如何在重启等情况下执行此功能?

【问题讨论】:

  • 我不确定我是否理解了这个问题:当您运行机器人时,您希望此功能运行,还是重新启动?
  • 您可以将当前时间保存到一个文件中,并在机器人重新启动时加载该文件,并检查是否已经过了 500 秒,然后触发输出
  • @yotam rec 看看上面的评论,以更好地了解我想要做什么
  • 在这种情况下,我建议保存传递到某种文件中的时间量,它甚至可以是 .txt 文件
  • @yotam rec 这不是困难的部分,困难的部分是在机器人再次启动时从中断处重新调用函数

标签: python python-3.x discord discord.py


【解决方案1】:

我实现类似这样的方式是使用 try-finally 循环,即使您停止/重新启动您的机器人,finally 部分也会执行(不是使用所有杀死进程的方法)

try:
    client.run(TOKEN)
finally:
    save('data.json', data)

要完成这项工作,您可以扩展需要重新启动的命令,其中包含保存到全局字典/列表的部分。类似的东西(hellosave 是这里的全局列表):

hellosave.append((time.time() + 500, ctx.channel.id))
await asyncio.sleep(500)
await ctx.send("Hello!")
hellosave.pop(0)

作为 save(),您将获取该全局 dict/list 并将其保存为某种格式(您可以按照自己喜欢的方式进行操作,从酸洗到将其打印到 .txt 文件中 [我在这里选择了 json,因为我需要它是可读的,在你的情况下可能不是这样])

下次启动机器人时,在 on_ready() 事件中查找该文件的内容并根据其中保存的数据重新启动函数,例如您的 hello 案例,您将检查时间是否在保存的事件已经过去,如果它有你立即发送它(或根本不发送)如果它还没有创建一个带有asyncio.create_task 的任务,它等待它需要的数量(time.time() - hellotime) [to完成这项工作,您必须保存频道 ID,就像我在示例中所做的那样]

【讨论】:

    猜你喜欢
    • 2018-09-03
    • 1970-01-01
    • 2020-08-02
    • 2021-09-01
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    相关资源
    最近更新 更多