具有多线程的协程

问题描述 投票:0回答:1

所以我一直在尝试制作这个使用 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

当我不添加它时,它工作正常。我检查了源代码,我认为它无法检测循环。有没有办法,我可以将运行循环传递给它?

我尝试过翻阅,但找不到任何有用的东西

multithreading parallel-processing discord discord.py python-asyncio
1个回答
0
投票

更新:所以对我有用的是使用

asyncio.to_thread
,这就是@jsbueno 的建议。我只是运行多个线程,并将数据返回到
on_message
函数/侦听器内的异步消息传递函数。

© www.soinside.com 2019 - 2024. All rights reserved.