我正在编写一个延迟任务,旨在构建blobstore中的文件以供下载。我正在为文档中给出的示例建模代码:
http://code.google.com/appengine/articles/deferred.html
我们的想法是构造代码,这样如果有DeadlineExceededError,处理程序可以整理并启动新的延迟任务以便以后继续。
我想知道的是什么时候可以抛出这个异常?是否有任何保证是原子的操作,因此不会被中断?
在上面引用的示例中,他们更新了一个名为start_key的变量,因为它们完成了对每条记录的处理,但是说在主页循环在to_put和to_delete列表的扩展之间被中断,那么数据就会出错,就像它会做的那样错过了一系列删除。
如果可以在任何时候引发异常,那么它可能在batch_write的中途,或者在db.put和清除to_put列表之间。
这在逻辑上等同于线程安全问题,解决它通常保证原子操作和非原子操作。
这是如何运作的?
谢谢
答案 0 :(得分:2)
DeadlineExceededError可以在任何时候按字面意思抛出。如果有一段时间它无法被抛出,那么滥用的应用程序可以简单地在循环中执行该代码。
您可以通过以下几种方式避免这种情况: