【问题标题】:discord.py - Unloading Cogs with async cleanup functiondiscord.py - 使用异步清理功能卸载 Cogs
【发布时间】:2021-05-29 23:53:37
【问题描述】:

我正在运行 discord.py 1.6。 我加载了一个 Cog,它在 Discord 上维护一个仪表板样式的消息(定期更新)。

卸载此 Cog 时,我想使用默认值自动删除此仪表板消息 await message.delete() 方法,这是一个异步调用。

根据文档,自动运行 Cog-cleanup 代码基本上有 2 个选项:

  1. 扩展清理功能teardown() - 不是异步的。 https://discordpy.readthedocs.io/en/latest/ext/commands/extensions.html#cleaning-up

  2. Cog 方法 cog_unload() - 也不是异步的。 https://discordpy.readthedocs.io/en/latest/ext/commands/api.html#discord.ext.commands.Cog.cog_unload

但是,在加载 Cog 时,有 async 调用前和调用后挂钩可用。 https://discordpy.readthedocs.io/en/latest/ext/commands/api.html#discord.ext.commands.Cog.cog_before_invoke

因此,我的问题是: 卸载 Cogs时有什么方法可以自动运行(await)异步代码?

编辑: 通过构建自定义扩展重新加载器,调用 exit()、reload() 和 init() 解决了这个问题。

谢谢!

【问题讨论】:

    标签: discord.py


    【解决方案1】:

    asyncio.create_task 调度协程运行,但不等待它运行。如果您使用的是 Python 3.6 或更低版本,请使用 asyncio.ensure_future()

    【讨论】:

      【解决方案2】:

      你试过asyncio.run() 吗?这通常是尝试在同步线程中调用async 函数时的解决方案,因为您不需要await run() 函数

      【讨论】:

      • 原来它根本不执行清理功能。也试过asyncio.get_event_loop().run_until_complete(self.exit()),但也没有用。
      猜你喜欢
      • 1970-01-01
      • 2020-09-26
      • 2021-05-24
      • 2021-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-30
      相关资源
      最近更新 更多