Как сохранить значение memcache до пополнения квоты?

Чтобы отправлять не более 100 сообщений электронной почты в день, я создаю следующую логику в своем приложении:

  1. все отправляемые сообщения хранятся в хранилище данных;
  2. есть задание cron, которое выполняется каждые 15 минут;
  3. это задание отправлять сообщения электронной почты из очереди;
  4. до чтения сообщений из очереди хранилища данных задание считывает значение из кэша памяти (is_todays_quota_exceeded);
  5. если это не так, попробуйте отправить сообщения. В случае успеха обновите состояние очереди для этого сообщения. Если это не с 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 Вы знаете, что день только начался и действуйте соответственно.

Другие вопросы по тегам