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, чтобы не загромождать код функции.