什么时候可以在Google App Engine中抛出DeadlineExceededError异常

时间:2012-01-14 14:28:40

标签: python google-app-engine

我正在编写一个延迟任务,旨在构建blobstore中的文件以供下载。我正在为文档中给出的示例建模代码:

http://code.google.com/appengine/articles/deferred.html

我们的想法是构造代码,这样如果有DeadlineExceededError,处理程序可以整理并启动新的延迟任务以便以后继续。

我想知道的是什么时候可以抛出这个异常?是否有任何保证是原子的操作,因此不会被中断?

在上面引用的示例中,他们更新了一个名为start_key的变量,因为它们完成了对每条记录的处理,但是说在主页循环在to_put和to_delete列表的扩展之间被中断,那么数据就会出错,就像它会做的那样错过了一系列删除。

如果可以在任何时候引发异常,那么它可能在batch_write的中途,或者在db.put和清除to_put列表之间。

这在逻辑上等同于线程安全问题,解决它通常保证原子操作和非原子操作。

这是如何运作的?

谢谢

1 个答案:

答案 0 :(得分:2)

DeadlineExceededError可以在任何时候按字面意思抛出。如果有一段时间它无法被抛出,那么滥用的应用程序可以简单地在循环中执行该代码。

您可以通过以下几种方式避免这种情况:

  1. 主动检查您执行的时间,并在截止日期前的适当时间停止。
  2. 将异常处理程序放在可以存储最后一组已完成操作的状态的地方(例如,丢弃自抛出异常的外部循环的最后一次迭代以来的任何内容)
  3. 使用没有截止日期的后端。