2013-03-31 5 views
6

Google App Engine pozwala _post_put_hook(self, future), udokumentowane w sposób następujący:Kiedy model _post_put_hook modelu ndb ma inną przyszłość niż ja? NDB

hak, który biegnie po put()

Aby zrozumieć ten hak lepiej, zastanawiam się kiedy self będzie różnił się od wyniku Argument future.

Dokumentacja Model Hooks zapewnia:

Jeśli używasz post-haki z asynchronicznymi API, haki są wywoływane przez wywołanie check_result(), get_result() lub otrzymując (wewnątrz tasklet) przyszłość metoda transmisji asynchronicznej jest. Post hooks nie sprawdzają, czy RPC się powiodło; zaczep działa bez względu na awarię.

Wszystkie post-haki mają argument Future na końcu podpisu połączenia. Ten obiekt Future zawiera wynik działania. Możesz wywołać metodę get_result() w tej przyszłości, aby pobrać wynik; możesz być pewien, że funkcja get_result() nie będzie blokować, ponieważ Przyszłość jest zakończona przed wywołaniem haka.

Jednakże gdy zgłoszę put asynchronicznie tak:

from google.appengine.ext import ndb 

class MyModel(ndb.Model): 
    xyz = ndb.StringProperty() 

    def _post_put_hook(self, future): 
     print "self.xyz: {}, future.xyz: {}".format(
      self.xyz, future.get_result().get().xyz)) 

m = MyModel() 
f = m.put_async() 
f.wait() 

m.xyz = 'abc' 
f = m.put_async() 
f.wait() 

Wyjścia:

self.xyz: None, future.xyz: None 
self.xyz: abc, future.xyz: abc 

W kontekście 'put_async', myślę, że można by zasadnie oczekiwać self do być modelem przed modyfikacją, a model future jest modelem, który został zapisany. W przeciwnym razie nie jest jasne, jaki cel miałby cel future w kontekście .

Kiedy będą self i future różnić się w kontekście put? Jaki jest cel tutaj future?

Odpowiedz

10

Uważam, że odpowiedź jest w opisie:

haki post nie sprawdzają, czy RPC był udany; Hak działa niezależnie od awarii.

Przyszłość może zawierać przyczynę niepowodzenia podczas wykonywania put(). Możesz użyć tej wiedzy, aby poradzić sobie, gdy nie powiedzie się za pomocą haka. Na przykład, jeśli twój _post_put_hook był odpowiedzialny za inkrementację skojarzonego modelu agregacji SUM na podstawie właściwości modelu, może najpierw sprawdzić, czy put powiodło się przed próbą zwiększenia skojarzonego modelu agregacji SUM. Nie wierzę, że wartość self i future.get_result().get() będzie inna, o ile RPC nie zawiedzie.

Zawsze istnieje możliwość, że inny wniosek zaktualizowany model po to żądanie użytkownika put ale zanim _post_put_hook został stracony, w którym future.get_result().get(use_cache=False) może wrócić inną wartość.

+0

Dzięki - to pouczające i wnikliwe. –