Как сохранить значение memcache до пополнения квоты?
Чтобы отправлять не более 100 сообщений электронной почты в день, я создаю следующую логику в своем приложении:
- все отправляемые сообщения хранятся в хранилище данных;
- есть задание cron, которое выполняется каждые 15 минут;
- это задание отправлять сообщения электронной почты из очереди;
- до чтения сообщений из очереди хранилища данных задание считывает значение из кэша памяти (
is_todays_quota_exceeded
); - если это не так, попробуйте отправить сообщения. В случае успеха обновите состояние очереди для этого сообщения. Если это не с
apiproxy_errors.OverQuotaError
, записыватьis_todays_quota_exceeded
равно1
,
У меня проблема в том, что я должен хранить значение memcache до конца дня GAE (то есть до тех пор, пока квота не будет пополнена). Как я могу рассчитать это в секундах?
Ежедневные квоты пополняются ежедневно в полночь по тихоокеанскому времени.
Upd. Я пробовал следующее:
now = datetime.datetime.now()
current_time = datetime.datetime(year=now.year, month=now.month, day=now.day, hour=now.hour, minute=now.minute, second=now.second)
end_of_today = datetime.datetime(year=now.year, month=now.month, day=now.day, hour=23, minute=59, second=59)
diff = end_of_today - current_time
logging.info(diff.total_seconds())
Но это не удается в последней строке - 'datetime.timedelta' object has no attribute 'total_seconds'
, Я использую Python 2.5, похоже total_seconds
был реализован позже.
Upd2. Следующее помогает рассчитать количество секунд до конца сегодняшнего дня:
now = datetime.datetime.utcnow()
diff = (23*60*60 + 59*60 + 59*60) - (now.hour*60*60 - now.minute*60 - now.second*60)
logging.info(diff)
1 ответ
В вашем облаке есть еще одно задание cron, которое выполняется до полуночи по тихоокеанскому времени каждый день для сброса этого значения.
Если вы хотите рассчитать конец дня, сделайте что-то вроде этого:
>>> from datetime import datetime
>>> timestamp = datetime.utcnow()
>>> end_of_day = datetime(year=timestamp.year, month=timestamp.month, day=timestamp.day, hour=23, minute=59, second=59)
>>> end_of_day
datetime.datetime(2013, 3, 17, 23, 59, 59)
Или вы можете просто проверить, если datetime.utcnow().hour
является 0
Вы знаете, что день только начался и действуйте соответственно.