Python sleep for second для дросселирования запросов

У меня есть периодическая задача celery, которая имеет вызов функции внутри нее, мне нужно, чтобы код спал в течение секунды на каждые 20 отправленных писем, как я могу этого добиться.

 @app.task(bind=True)
 def send_email_reminder_on_due_date(self):
      send_email_from_template(
            subject_template_path='emails/subject.txt',
            body_template_path='emails/template.html',
            template_data=template_data,
            to_email_list=email_list,
            fail_silently=False,
            content_subtype='html'
        )

У меня есть некоторое условие перед send_email_from_template т.е. выборка записей из базы данных с датой исполнения сегодня, и я буду отправлять email для всех записей, которые я получу, скажем, у меня есть 30 записей, для которых мне нужно отправить email, поэтому я сделаю sleep на 1 секунду после выполнения функции email для 20 записей.

Я бы решил эту проблему следующим образом:

  1. извлечь 20 записей из базы данных (LIMIT 20 с помощью mysql)
  2. подождите 1 секунду
import time
time.sleep(1) # Sleep for 1 second
  1. повторите первый шаг

При таком решении более новые электронные письма в базе данных, например, могут быть отозваны или даже изменены.

Есть ли другой способ сделать это без ограничения на уровне базы данных Happy

.
records = mycursor.fetchall()

i = 0
for record in records:
  send_email(record)
  i = i + 1
  if i % 20 == 0:
    time.sleep(1)
Вернуться на верх