Python sleep, если функция выполняется 20 раз

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

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

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

send_email_from_template - это функция, которая используется для отправки электронного письма

Возможно, я упускаю важный момент в том, что вы можете/не можете делать из-за использования celery, но я напишу, если это будет полезно. Вы можете отслеживать состояние функции, присваивая функции атрибуты. В приведенном ниже коде я присваиваю атрибут times_without_sleep фиктивной функции и отслеживаю ее значение sleep каждые 20 вызовов.

# ====================
def my_function():

    if not hasattr(my_function, 'times_without_sleep'):
        my_function.times_without_sleep = 0

    print('Do the stuff')

    if my_function.times_without_sleep >= 20:
        print('Sleep')
        my_function.times_without_sleep = 0
    else:
        my_function.times_without_sleep += 1


# ====================
if __name__ == "__main__":

    for i in range(0, 100):
        my_function()

Вы также можете задать значение атрибута для функции, если вам нужно установить, например, my_function.times_without_sleep = 0 в конце цикла писем и т.д.

Можно ли просто сделать что-то подобное с помощью send_email_from_template? Вы также можете сделать его декоратором, как в this answer, чтобы не загромождать код функции.

Вернуться на верх