Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 何时可以在Google应用程序引擎中引发DeadlineExceededError异常_Python_Google App Engine - Fatal编程技术网

Python 何时可以在Google应用程序引擎中引发DeadlineExceededError异常

Python 何时可以在Google应用程序引擎中引发DeadlineExceededError异常,python,google-app-engine,Python,Google App Engine,我正在编写一个延迟任务,它打算在blobstore中构建一个文件以供下载。我根据文档中给出的示例对代码进行建模: 这样做的目的是构造代码,以便处理程序可以整理并启动新的延迟任务,以便稍后继续 我想知道的是什么时候可以抛出这个异常?是否有任何操作保证是原子的,因此不会被中断 在上面的示例中(参考),他们在完成处理每个记录时更新一个名为start_key的变量,但如果主循环在扩展to_put和to_delete列表之间中断,那么数据将是错误的,因为它将丢失一组删除 如果可以在任何时候引发异常,那么

我正在编写一个延迟任务,它打算在blobstore中构建一个文件以供下载。我根据文档中给出的示例对代码进行建模:

这样做的目的是构造代码,以便处理程序可以整理并启动新的延迟任务,以便稍后继续

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

在上面的示例中(参考),他们在完成处理每个记录时更新一个名为start_key的变量,但如果主循环在扩展to_put和to_delete列表之间中断,那么数据将是错误的,因为它将丢失一组删除

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

这在逻辑上相当于线程安全问题,要解决它,通常需要保证原子操作和非原子操作

这是怎么回事


谢谢

任何时候都可以抛出一个deadlineexcedederror。如果有一段时间它不能被抛出,滥用的应用程序可以简单地在循环中执行该代码

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

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

  • 谢谢你的回复。这正是我所猜测的,但通常我仍然希望会有一些原子操作,相当于比较和交换。这通常是安全的,因为即使在循环中执行,也可以中断。我想这是脚本语言中比较困难的事情之一。我在本例中选择的解决方案是使用_target=参数在后端运行延迟任务。从成本爆炸的角度来看,这有点危险,但在我的例子中是有效的。似乎在调用类函数时,如果异常中断,则可以保证调用exit。@Jules这仅适用于与
    with
    语句一起使用的上下文对象,而不适用于硬截止日期异常。正如我所说,如果有任何代码是不可中断的,滥用的应用程序可以利用它。但是,请注意,标准异常处理程序可以捕获“软”截止日期超出错误。