【发布时间】:2012-03-28 20:39:34
【问题描述】:
在我的应用程序中,对于一个处理程序,我需要获取一堆实体并为每个实体执行一个函数。
我拥有我需要的所有实体的钥匙。获取它们后,我需要为它们中的每一个执行 1 或 2 个实例方法,这会大大降低我的应用程序的速度。对 100 个实体执行此操作大约需要 10 秒,这太慢了。
我试图找到一种方法来获取实体并并行执行这些功能以节省时间,但我不确定哪种方法最好。
我尝试了 _post_get_hook,但我有一个未来的对象,需要调用 get_result() 并执行钩子中的函数,这在 sdk 中工作正常,但在调用 Python 时得到了很多“最大递归深度” objec',但我真的不明白为什么,错误信息也不是很详细。
我在搜索什么 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
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])
这个tasklet代码可以吗?
【问题讨论】:
-
函数慢是因为它们进行大量计算,还是因为它们等待 RPC?如果前者,线程或任务队列是你最好的选择;如果是后者,NDB 小任务就是你想要的。详细说明,我可以发布一个答案来展示其中一个。
-
@NickJohnson 主要是在等待 RPC。我用更多细节编辑了这个问题。
标签: google-app-engine python-2.7 app-engine-ndb