在我的应用程序中,对于一个处理程序,我需要获取一堆实体并为每个实体执行一个函数。
我有我需要的所有实体的钥匙。获取它们后,我需要为它们中的每一个执行 1 或 2 个实例方法,这会大大降低我的应用程序的速度。对 100 个实体执行此操作大约需要 10 秒,这很慢。
我试图找到一种方法来获取实体并并行执行这些功能以节省时间,但我不确定哪种方法最好。
我尝试了 _post_get_hook 但我有一个未来的对象,需要调用 get_result() 并执行钩子中的函数,该函数在 sdk 中工作正常,但得到很多“调用 Python 对象时超出最大递归深度”但是我真的不明白为什么,错误信息也不是很详细。
Pipeline api 或 ndb.Tasklets 我在寻找什么?
atm 我正在反复试验,但如果有人能引导我走向正确的方向,我会很高兴。
编辑
我的代码类似于文件系统,每个文件夹都包含其他文件夹和文件。集合的路径设置在另一个实体上,因此要序列化集合实体,我需要获取引用的实体并获取路径。在 Collection 上, 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
编辑2:
@ndb.tasklet
def serialized_assets(self, keys=None):
assets = yield ndb.get_multi_async(keys)
raise ndb.Return([asset.serialized for asset in assets])
这个tasklet代码可以吗?