Ограничение рассылки уведомлений
У меня есть такая простенькая функция которая каждые 10 секунд получает значение из бд и если это значение удовлетворяет условиям то возвращает его. Все работает хорошо.
import pyodbc,datetime,schedule, time
from threading import Thread
def prostoi():
conn = pyodbc.connect('DRIVER=DRIVER;SERVER=SERVER;DATABASE=DATABASE;UID=UID;PWD=PWD')
cursor = conn.cursor()
with conn:
sql = "тут запрос"
for row in cursor.execute(sql):
now = datetime.datetime.now()
if (now-row[0]).seconds > 300 and (now-row[0]).days<1:
pros = now-row[0]
return result
else:
pass
def run_schedule_reg():
schedule.every(10).seconds.do(prostoi)
while True:
schedule.run_pending()
time.sleep(1)
thread = Thread(target=run_schedule_reg).start()
Но появилась необходимость, если это значение , например больше 300, то надо отправить уведомление. Функция для отправки уведомления уже написана и тоже работает. Если я ее буду вызывать место return , то уведомления будут отсылаться каждые 10 секунд. Как мне можно ограничить отсылку этих уведомлений , например чтобы они отсылались раз в 10 минут. Но при это запросы к бд попрежнему выполнялись каждые 10 секунд.
Ответы (1 шт):
Сделай декоратор вроде такого:
def ratelimit(limit=600):
def deco(func):
func.lastrun = 0
def inner(*a,**kw):
if time.time() - func.lastrun > limit:
func.lastrun = time.time()
return func(*a,**kw)
return inner
return deco
Тут навешивается на функцию время её последнего запуска. А использовать так:
@ratelimit(600)
def sendmsg(data):
....