私のアプリでは、ハンドラの1つのエンティティの束を取得し、それぞれの関数を実行する必要があります。並列コードの実行python2.7 ndb
私は必要なすべてのエンティティの鍵を持っています。それらをフェッチした後、私はそれぞれの1つまたは2つのインスタンスメソッドを実行する必要があり、これは私のアプリケーションをかなり減速させます。これを100個のエンティティに対して行うには約10秒かかりますが、それは遅くなります。
エンティティを取得してそれらの関数を並列に実行して時間を節約する方法を見つけようとしていますが、どの方法が最良かはわかりません。
私は_post_get_hookを試しましたが、将来のオブジェクトがあり、get_result()を呼び出してsdkでokのように機能するフックで関数を実行する必要がありますが、最大再帰深度を超えると、 Python objec 'が、私は本当にundestandできない、なぜ、エラーメッセージは本当に精巧ではありません。
はパイプラインAPIまたはndb.Taskletsです。何を検索していますか?
atm imは試行錯誤していますが、誰かが私を正しい方向に導くことができれば嬉しいです。
EDIT
私のコードは、ファイルシステムに似たもので、すべてのフォルダは他のフォルダとファイルが含まれています。他のエンティティに設定されたコレクションのパスは、コレクションエンティティをシリアル化するために、参照されたエンティティを取得してパスを取得する必要があります。コレクションでは、serialized_assets()関数が含まれているエンティティの数が少なくなると、その処理が遅くなります。もし私が含まれている資産ごとにシリアル化関数を実行することができれば、それはかなり高速化します。
class Index(ndb.Model):
path = ndb.StringProperty()
class Folder(ndb.Model):
label = ndb.StringProperty()
index = ndb.KeyProperty()
# contents is a list of keys of contaied Folders and Files
contents = ndb.StringProperty(repeated=True)
def serialized_assets(self):
assets = ndb.get_multi(self.contents)
serialized_assets = []
for a in assets:
kind = a._get_kind()
assetdict = a.to_dict()
if kind == 'Collection':
assetdict['path'] = asset.path
# other operations ...
elif kind == 'File':
assetdict['another_prop'] = asset.another_property
# ...
serialized_assets.append(assetdict)
return serialized_assets
@property
def path(self):
return self.index.get().path
class File(ndb.Model):
filename = ndb.StringProperty()
# other properties....
@property
def another_property(self):
# compute something here
return computed_property
EDIT2:
@ndb.tasklet
def serialized_assets(self, keys=None):
assets = yield ndb.get_multi_async(keys)
raise ndb.Return([asset.serialized for asset in assets])
は、このタスクレットのコードは大丈夫でしょうか?
多くの計算が必要なため、またはRPCを待っているために機能が遅いのですか?前者の場合、スレッドやタスクキューが最善の策です。後者の場合、NDBのタスクレットが必要なものです。精巧で、どちらかを示す答えを投稿することができます。 –
@NickJohnsonはRPCを待っています。私は詳細を編集して質問を編集しました。 – aschmid00