是否使用discord.py在单独的线程中发送消息?

2024-09-27 23:25:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为discord bot编写一个命令(/mc/是前缀),以获取结果并发送消息。但是获得结果需要很多时间。为了防止一次出现多个请求,我将获取结果的代码放在一个单独的函数mainmc()(而不是async)中,通过创建一个新类mainThreadMC(threading.Thread)来启动线程,并创建一个新的类对象并启动它,从而将mainmc作为线程调用,因此,当有多个请求时,命令将立即运行,而无需等待前一个请求。但是在我运行它之后,我很快发现它是不可能的,因为发送消息需要await,否则它将无法工作。但是如果函数中有await,则函数需要async。这意味着我必须编辑模块threading才能使其正常工作?当然,这不是解决问题的方法。但是我该怎么办呢

以下是代码(简化):

class mainThreadMC(threading.Thread):
    def __init__(self, threadID, name, ctx,args):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.args = args
        self.ctx = ctx
    def run(self):
        logger.info("Starting " + self.name)
        mainmc(self.ctx,self.args)
        logger.info(f'Exiting {self.name}')

def mainmc(ctx,args):
    # fetching data... creating / editing variable embed
    ctx.send(embed=embed)  #ERROR!!!!!!!!!!!
    # finalize...
    return

@bot.command(name='mc',pass_content=True)
async def mc(ctx,*,args=""):
    global runno
    threadMainMC = mainThreadMC(runno,f"MainMC_{str(runno)}",ctx,args)
    threadMainMC.start()

(我只是想让它发挥作用,所以如果您有其他解决方案,也可以告诉我。)

谢谢你的帮助


Tags: 函数nameselfasyncdefargsembedmc

热门问题