当前位置: 首页 > 知识库问答 >
问题:

在Python Discord bot中从同步线程发送消息

暴才俊
2023-03-14

我正在Python3.6中使用Discord.py库开发一个Discord bot,在试图从创建的线程向特定通道发送消息时遇到了问题。

基本上,我有一些线程监视网站,我想调用一个函数(我正在传递给线程),当我注意到网站上的变化时,它会向一个特定的通道发送消息。

我最初尝试直接调用client.send_message(),而不使用Async/await,但它根本不起作用,所以我编写了Async/await函数发送消息(测试了它,它起作用了),但从线程调用它时再次遇到问题,所以我最终将bot客户端传递给我的线程,并调用self.bot_client.loop.create_task(Self.SendMsgFunction(msg))。这是可行的,但与机器人使用通常的@bot.event函数应答消息所需的时间相比,它慢得令人难以置信(发送消息需要大约15秒,而且这可能不是正确的方法)。

我已经尝试用asyncio创建一个事件循环,然后调用该函数,但我还是以错误告终。

有什么想法吗?

共有2个答案

韩智敏
2023-03-14

如果您想将消息发送到一个特定的通道,首先您应该获得通道对象。

channel = discord.utils.get(ctx.guild.channels, id=channel_id_here)

那你就可以做

await channel.send()
米项禹
2023-03-14

您可以使用asyncio.run()运行异步函数,如下所示:

import asyncio

async def async_func():
    print("Async function run!")

asyncio.run(async_func())
 类似资料:
  • 如何在Kafka中发送同步消息 实现这一点的一种方法是设置properties参数 。 但是我想知道是否有一种甚至直接或替代的方式在Kafka中发送同步消息。(比如producer.sync发送(...)等等)。

  • 我是如何临时修复它的:考虑我已经实现了下面的方法 它向websocket会话发送一个TextMessage。我无法使整个方法同步,因为多个线程可以为不同的websocketSessions和消息调用它。我也不能将会话放在同步块中(尝试了但没有工作) 虽然,我这样解决了我的问题

  • 主要内容:1 invokeOneway单向发送,1.1 invokeOnewayImpl单向调用,2 sendMessageSync同步发送,2.1 invokeSync同步调用,3 sendMessageAsync异步发送消息,3.1 invokeAsync异步调用,3.2 onExceptionImpl异常处理,4 NettyClientHandler处理服务端消息,4.1 processResponseCommand处理响应,基于RocketMQ release-4.9.3,深入的介绍了P

  • 我正在为android中的knx模块开发一个串口应用程序。我可以向knx modulde发送和接收赞扬。当从serialport接收到消息时,我想更改ui(例如按钮属性)。我用处理程序试过了,但我无法更改ui。帮我一把。 @覆盖公共空OnSerialsData(最终字节[]缓冲区,最终int大小){......} 它是我的串行端口侦听器函数,调用insine ReadThread。此线程从我的活动

  • 当我尝试通过启动不同的线程来执行所有同步方法时,我在一个类中有三个同步方法,我看不到同步的输出,在对象上没有获得锁 公共类DisplayMessage{ }线程类: 公共类 MyThread 扩展了线程 { }Thread2类:公共类MyThread2扩展线程{ } 线程 3 类: 包装Synchronization.classlock; 公共类MyThread3扩展线程{ } 使用main方法生

  • 下面的代码创建了一个新的custom um < code > Thread ,并等待线程结束,直到主线程再次激活。 > < li >我不太明白它是如何工作的。为什么< code > myth read . wait();立即接到电话? < li> 为什么不改用< code>Thread.join()? 公共静态void main(String[] args) {