所以我一直在尝试制作这个使用 yolov8 对象检测模型进行推理的不和谐机器人。我正在
on_message
事件中运行推理函数,但由于它的阻塞性质,我无法一次发出多个请求。我能够为模型实例创建多个线程,并且能够并行处理多个请求。现在我面临的问题是 message.channel.send
,因为它是一个协程,但线程只能运行同步函数。我也能够通过使用 asyncio.run_coroutine_threadsafe()
来解决消息传递问题,但只有当我排除 discord.ui.View()
时。
代码:
asyncio.run_coroutine_threadsafe(message.channel.send(f"{message.author.mention} Here are your results: ",file= discord.File(fp=image_bytesio, filename="image.jpeg"), embeds=sendEmbed, view = discord.ui.View().add_item(discord.ui.Button(label="Join My Discord Server", emoji=emoji,style=discord.ButtonStyle.gray, url="https://discord.gg/sERCEe"))), client.loop)
错误:
Exception in thread Thread-92 (detect):
Traceback (most recent call last):
File "/usr/lib/python3.10/threading.py", line 1016, in _bootstrap_inner
self.run()
File "/usr/lib/python3.10/threading.py", line 953, in run
self._target(*self._args, **self._kwargs)
File "<ipython-input-36-5d42097b2506>", line 245, in detect
File "/usr/local/lib/python3.10/dist-packages/discord/ui/view.py", line 192, in __init__
self.__stopped: asyncio.Future[bool] = asyncio.get_running_loop().create_future()
RuntimeError: no running event loop
当我不添加它时,它工作正常。我检查了源代码,我认为它无法检测循环。有没有办法,我可以将运行循环传递给它?
我尝试过翻阅,但找不到任何有用的东西
更新:所以对我有用的是使用
asyncio.to_thread
,这就是@jsbueno 的建议。我只是运行多个线程,并将数据返回到 on_message
函数/侦听器内的异步消息传递函数。