如果我对不协调.py命令使用帮助函数,我应该使用wait来调用我的帮助函数,还是只是将控制权转移到我的异步助手



我有一个命令,可以发送遵循相同结构的多种类型的消息,但我使用的是帮助函数来发送消息。为了简单起见,我的代码看起来像这样:

选项1:

async def helper(context: Context, msg_type: str, param1, param2, ...):
# Some code to create the message to be sent ...
embed = discord.Embed(description=message)
await context.send(embed=embed)
@commands.hybrid_command(
name="run",
description="Sends a reminder to run."
)
def run(context: Context, param1, param2, ...):
# Some input validation for run command ...
helper(context, 'run', param1, param2, ...)
@commands.hybrid_command(
name="walk",
description="Sends a reminder to walk."
)
def walk(context: Context, param1, param2, ...):
# Some input validation for walk command ...
helper(context, 'walk', param1, param2, ...)

选项2使每个函数异步,并使用wait调用helper。

这是我第一次创建discordbot并使用async/await。我已经读到async/await的经验法则是在需要等待某些计算的地方使用async,特别是如果它在代码外部,比如API。

  1. 我希望得到一些指导,以了解我应该或不应该在我的discord bot中使用async/await,或者在一般情况下。为了提高效率,假设这个机器人程序将由100k以上的用户执行(如果需要考虑的话(,并且助手函数还涉及调用除discord之外的API
  2. 我只找到了1个命令=1个操作的机器人命令的方法,是否有实现组合命令的建议?也许我的命令应该是调用我的助手函数(比如/send run或/send walk(,并将消息类型作为第一个命令

选项1是个坏主意。您应该始终await异步函数(除非在main中,您别无选择,只能使用类似asyncio库的东西来启动它,但这不适用于此处(。

换言之,备选方案2是我们要走的路。你唯一需要改变的就是在命令回调前添加一个额外的单词,所以作为一名开发人员,这对你来说真的没有任何区别。此外,这将允许您调用其他非常有用的异步函数。根本没有理由不选择方案2。

我希望得到一些指导,以了解我应该或不应该在我的discord bot中使用async/await,或者在一般情况下。

您应该尽可能使用它,但主要用于可能需要几秒钟(如果不是更多的话(的慢速部件。如果你的机器人程序中的所有内容都是同步的,那么你的整个机器人程序将冻结,直到命令完成。如果它将由";100k+用户";,想象一下,100k多个命令排在一个队列中,因为每个命令都必须一个接一个地执行。你的机器人会连续几分钟冻结。

关于";"阻塞";,阅读Discord.py文档:https://discordpy.readthedocs.io/en/stable/faq.html#what-阻塞意味着吗

基本上:如果你能让它异步,你就没有理由不让它异步。你不应该认为;我应该让这个部分异步吗"答案实际上总是";是的";。

并且助手函数还涉及调用除discord之外的API。

API调用应始终是异步的。一个请求可能需要几秒钟的时间。如果你的机器人有10万多名用户,而其中只有100人(0.1%(同时运行该命令,那么你的机器人在数百秒内根本没有响应。关于阻塞的文档页面已经解释了如何进行异步API调用。

想象一下,如果我使用一个命令向速度非常慢的服务器发出API请求。你认为你的100000多名用户会同意你的整个机器人在30秒内变得没有反应吗?因为一个人调用了一个命令,而这个命令恰好发出了一个缓慢的请求?

同样的概念也适用于数据库交互。有了数十万用户,查询将不可避免地开始放慢速度。你不会希望你的机器人也变得慢得令人难以忍受,因为它95%的时间都在等待数据库查询完成,是吗?

我只找到了1个命令=1个操作的bot命令的方法,是否有实现组合命令的建议?

不完全确定你的意思-你想更详细地解释一下吗?

最新更新