首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果我对一个discord.py命令使用帮助函数,我应该使用等待调用我的帮助函数还是将控制传递给我的异步助手?

如果我对一个discord.py命令使用帮助函数,我应该使用等待调用我的帮助函数还是将控制传递给我的异步助手?
EN

Stack Overflow用户
提问于 2022-10-17 12:26:26
回答 1查看 41关注 0票数 1

我有一个命令,可以按照相同的结构发送多种类型的消息,但是我使用一个帮助函数来发送消息。为了简单起见,我的代码看起来类似于以下内容:

备选案文1:

代码语言:javascript
运行
复制
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是使每个函数异步和调用助手与等待。

这是我第一次创建一个不和谐的机器人,并使用异步/等待。我读过异步/等待的经验法则是使用异步,在这里您需要等待一些计算,特别是如果它在代码外部,比如API。

  1. ,我希望得到一些指导,以理解在我的不和谐的机器人或一般情况下,我应该在哪里使用异步/等待。为了提高效率,假设这个bot将由100k+用户执行(如果需要考虑这个问题),并且助手函数也涉及调用API而不是不和谐。
  2. I只找到了用于bot命令的方法,其中1命令=1操作,有实现组合命令的建议吗?也许我的命令应该是调用我的助手函数(比如/send、run或/send say),第一个命令是消息类型?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-17 21:50:15

备选方案1是个坏主意。您应该始终使用 await异步函数(除非在您的main中,您没有选择,只能使用像asyncio库这样的东西来启动它,但这在这里不适用)。

换句话说,备选案文2是要走的路。唯一需要更改的是在命令回调之前添加一个额外的单词,这样对于开发人员来说并没有什么不同。此外,这将允许您调用其他非常有用的异步函数。根本没有理由不采用备选方案2。

,我希望得到一些指导,以理解在我的不和谐的机器人或一般情况下,我应该在哪里使用异步/等待。

您应该尽可能地使用它,但主要用于可能需要几秒钟(如果不是更长的话)的慢部分。如果bot中的所有内容都是同步的,则整个bot将冻结到命令完成为止。如果它要由“100 k+用户”执行,想象一下100k+命令位于队列中,因为每个命令都必须一个接一个地执行。你的机器人会连续冻结几分钟。

有关“阻塞”的更多信息,请阅读Discord.py文档:https://discordpy.readthedocs.io/en/stable/faq.html#what-does-blocking-mean

基本上:如果你能使它异步,你没有理由不使它异步。你不应该想“我应该做这个部分异步吗?”答案实际上总是“是”。

和助手函数也涉及到调用API而不是不和谐。

API调用应该始终是异步。一个请求最多需要几秒钟。如果你的机器人有100k+用户,而其中只有100个用户(0.1%)同时运行这个命令,那就是你的机器人根本没有响应的几百秒。关于阻塞的docs页面已经解释了如何进行异步API调用。

想象一下,如果我使用一个命令向一个非常慢的服务器发出API请求。您认为您的100.000+用户会因为一个人调用一个碰巧发出一个慢请求的命令而使整个机器人在30秒内失去响应吗?

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

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

你不太清楚这是什么意思-你能不能更详细地解释一下?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74097256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档