2

为了每天发送不超过 100 封电子邮件,我在我的应用程序中创建了以下逻辑:

  1. 所有要发送的电子邮件信息都存储在数据存储中;
  2. 有一个 cron 作业,每 15 分钟运行一次;
  3. 这项工作是从队列中发送电子邮件消息;
  4. 在从 Datastore 队列中读取消息之前,作业会从 memcache ( is_todays_quota_exceeded) 中读取值;
  5. 如果不是,请尝试发送消息。如果成功,则更新此消息的队列状态。如果它失败了apiproxy_errors.OverQuotaError,写is_todays_quota_exceeded等于1

我遇到的问题是我应该将 memcache 值存储到 GAE 日结束(即直到配额被补充)。我怎样才能在几秒钟内计算出来?

每日配额每天在太平洋时间午夜补充。

更新。我尝试了以下方法:

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是后来实现的。

更新2。以下有助于计算到今天结束的秒数:

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)
4

1 回答 1

2

您的云每天都有另一个在太平洋时间午夜之前运行的 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知道这一天刚刚开始并采取相应的行动。

于 2013-03-17T13:13:35.770 回答