Задать вопрос
@Hikanosu

AIOgram, как лучше обновить код рассылки, чтобы она не останавливалась из-за Flood control?

Изначально написал код для рассылки, но даже при маленьком количестве пользователей в рассылке, она останавливалась из-за Flood control. Переписал рассылку следующем образом и увеличил time out между сообщениями:
...
            for user in row:
                try:
                    await bot.send_message(chat_id=user[0], text=data['mailing_text'])
                except:
                time.sleep(0.1)
       ...

И этого хватило на некоторый промежуток времени. Но когда в рассылке стало больше 3000 человек, появилась новая проблема:
Flood control exceeded. Retry in n seconds.

Достаточно ли будет просто увеличить time out между сообщениями, чтобы избавиться от этой ошибки? Или есть лучшие способы исправления?
  • Вопрос задан
  • 2009 просмотров
Подписаться 1 Простой 2 комментария
Решения вопроса 1
shurshur
@shurshur
Сисадмин, просто сисадмин...
Не надо использовать time.sleep в асинхронном коде, это блокирует event loop! Вместо этого надо использовать асинхронный вариант asyncio.sleep.

По существу с таким кодом будет делаться 10 отправок в секунду, а официально лимит 30 в секунду. Но лучше бы дополнительно отлавливать исключение с flood control и по нему делать дополнительный sleep хотя бы на 1 секунду, а то и чуть больше, чтобы счётчик числа попыток на стороне Telegram обнулился за это время.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы