状態を操作するためのいくつかのインスタンスメソッドを公開するNDBモデルがあります。一部のリクエストハンドラでは、これらのインスタンスメソッドのいくつかを呼び出す必要があります。同じエンティティで複数回呼び出されないようにするためにput()
、これまでに使用したパターンは次のようになります。
class Foo(ndb.Model):
prop_a = ndb.StringProperty()
prop_b = ndb.StringProperty()
prop_c = ndb.StringProperty()
def some_method_1(self):
self.prop_a = "The result of some computation"
return True
def some_method_2(self):
if some_condition:
self.prop_b = "Some new value"
return True
return False
def some_method_3(self):
if some_condition:
self.prop_b = "Some new value"
return True
if some_other_condition:
self.prop_b = "Some new value"
self.prop_c = "Some new value"
return True
return False
def manipulate_foo(f):
updated = False
updated = f.some_method_1() or updated
updated = f.some_method_2() or updated
updated = f.some_method_3() or updated
if updated:
f.put()
基本的に、エンティティを更新する可能性のある各メソッドは、エンティティが更新されたために保存する必要があるかどうかを示すブール値を返します。put()
これらのメソッドを順番に呼び出すときは、いずれかのメソッドが返された場合は必ず呼び出すようにしますTrue
。
ただし、このパターンは、他のサブルーチンが関係する状況では実装が複雑になる可能性があります。その場合、サブルーチンから返された更新されたブール値をトップレベルのメソッドにバブルアップする必要があります。
現在、多くのリクエストハンドラーを最適化する過程にあり、AppStatによって報告されるウォーターフォールを可能な限り制限し、可能な限り多くの非同期APIを使用し、多くのメソッドをタスクレットに変換しようとしています。
この取り組みにより、NDB Asyncのドキュメントを読むことになりました。このドキュメントでは、NDBは、データストアへの1回のRPC呼び出しで複数のリクエストを組み合わせるオートバッチャーを実装していると述べています。これは異なるキーを含むリクエストに適用されることを理解していますが、同じエンティティへの冗長な呼び出しにも適用されますか?
言い換えれば、私の質問は、上記のコードパターンをこれに置き換えることができるかということです。
class FooAsync(ndb.Model):
prop_a = ndb.StringProperty()
prop_b = ndb.StringProperty()
prop_c = ndb.StringProperty()
@ndb.tasklet
def some_method_1(self):
self.prop_a = "The result of some computation"
yield self.put_async()
@ndb.tasklet
def some_method_2(self):
if some_condition:
self.prop_b = "Some new value"
yield self.put_async()
@ndb.tasklet
def some_method_3(self):
if some_condition:
self.prop_b = "Some new value"
yield self.put_async()
elif some_other_condition:
self.prop_b = "Some new value"
self.prop_c = "Some new value"
yield self.put_async()
@ndb.tasklet
def manipulate_foo(f):
yield f.some_method_1()
yield f.some_method_2()
yield f.some_method_3()
すべての呼び出しがエンティティput_async()
の単一の呼び出しに結合されますか?はいの場合、このアプローチを使用することと、更新された戻り値を手動でチェックして呼び出しシーケンスの最後に1回呼び出すput
ことに固執することについて、注意点はありますか?put