discord.py - 使用异步清理功能卸载 Cogs

时间:2021-02-28 03:11:42

标签: discord.py

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

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

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

  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() 解决了这个问题。

谢谢!

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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