Почему блокировка / буфер discord.py блокируется при ожидании очереди asyncio? - PullRequest
0 голосов
/ 07 февраля 2020

Сообщения отправляются «волнами», то есть ничего в течение пары секунд, а затем ~ 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 - это линия блокировки, поэтому, возможно, она также имеет какое-то отношение к скорости.

1 Ответ

1 голос
/ 08 февраля 2020

Это связано с тем, что ограничение скорости отправки сообщений через API Discord составляет 5/5 секунд.
Именно поэтому вы видите, что 5 сообщений отправляются одновременно, а затем задержка, так как скорость следующих сообщений ограничена.

...