Сообщения отправляются «волнами», то есть ничего в течение пары секунд, а затем ~ 5 почти одновременно. Я пропустил token
и channel
.
import discord, asyncio
class Bot(discord.Client):
def __init__(self, q, channel):
super().__init__()
self.q = q
self.channel_id = channel
self.bg_task = self.loop.create_task(self.send_messages())
async def on_message(self, message):
if message.author == self.user or message.channel.id != self.channel_id:
return
print(message.content)
async def send_messages(self):
await self.wait_until_ready()
channel = self.get_channel(self.channel_id)
while not self.is_closed():
msg = await self.q.get()
await channel.send(msg)
from threading import Thread
from time import sleep
q = asyncio.Queue()
def f():
while True:
q.put_nowait("hi")
sleep(2)
Thread(target=f).start()
bot = Bot(q, channel)
bot.run(token)
Как ни странно, событие on_message
кажется незатронутым, и, кроме того, замена msg = await self.q.get()
на
msg = "hi"
await asyncio.sleep(2)
, кажется, приводит к в ожидаемом поведении.
Я не уверен, где что-то не так go, поэтому я сохранил пример более конкретно c для Discord.
Edit
Расширяя поведение asyncio.sleep
, я заменил l oop in send_messages
на
if 0:
msg = await self.q.get()
else:
await asyncio.sleep(0.1)
if self.q.empty():
continue
msg = await self.q.get()
await channel.send(msg)
if
просто для переключения между оригиналом и экспериментом.
Ясно, что можно ожидать, что часть else
будет не более быстрой, чем часть if
, однако ожидание непустой очереди, похоже, полностью решает проблему.
Я начинаю думать, что разногласия и блокирующая асинхронная очередь взаимодействуют непредвиденным образом
С другой стороны, кажется, что channel.send
- это линия блокировки, поэтому, возможно, она также имеет какое-то отношение к скорости.