2012-01-14 55 views
3

我寫它的目的是建立一個文件中的Blob存儲區下載遞延任務被拋出。我造型上的文檔中給出的示例代碼:時候可以DeadlineExceededError例外,在谷歌應用程序引擎

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

的想法是結構上的代碼,這樣,如果有一個DeadlineExceededError處理程序可以整理和啓動新遞延任務繼續後來。

我想知道的是,當正好可以在這個異常被拋出?是否有任何保證是原子的操作,因此不會中斷?

在上面的例子中,他們更新了一個叫做start_key的變量,因爲他們完成了每條記錄的處理過程,但是說主循環在to_put和to_delete列表之間中斷了,那麼數據就會出錯,確實錯過了一組刪除。

如果異常可以在任何時候得到提升,則可能是中途batch_write之間,或to_put列表db.put和清算。

這是邏輯上等同於一個線程安全的問題,解決這個問題一個正常保證了原子操作和非原子操作。

這是如何工作的?

謝謝

回答

2

DeadlineExceededError在任何時候都可以從字面上拋出。如果有一段時間它不能被拋出,一個濫用的應用程序可以簡單地在一個循環中執行該代碼。

可以避免此幾種方法:

  1. 主動檢查多久你一直在執行,並在一個很好的時間停止你打的截止日期前。
  2. 將異常處理程序放在某處,它可以存儲最後一組已完成操作的狀態(例如,拋棄異常引發的最後一次迭代後的任何內容)
  3. 使用後端,沒有最後期限。
+0

感謝您的答覆。這正是我所猜測的,但通常我仍然會期待有一些原子操作,相當於比較和交換。這通常是安全的,即使在循環中執行它可能會中斷。我想這是腳本語言中更困難的事情之一。 – Jules 2012-01-16 11:06:27

+0

我選擇的解決方案是使用_target =參數在後端運行我的延期任務。從成本爆炸的角度來看,這有點危險,但在我的案例中是有效的。 – Jules 2012-01-16 11:25:39

+0

看起來,當調用類函數時,如果異常中斷它,保證調用__exit__。 – Jules 2012-01-17 16:11:48