我正在使用 gae 和 ndb 进行开发,我发现我必须为 ndb 获取和查询编写大量代码。有时我需要两个版本(有时是 3 个或更多)。
假设我在其中有以下模型和函数:
class MainEnt(ndb.Model):
"""Main entity. The parent is the user_key"""
name = ndb.StringProperty()
child = ndb.KeyProperty()
def get_created_by(self, user_id):
"""Get the MainEnt's created by user_id"""
# stuff... getting the query and returning the results
def get_created_by_async(self, user_id):
"""Get async the MainEnt's created by user_id"""
# stuff... getting the query async and returning a future
@ndb.tasklet
def get_childs_async_tasklet(self, mainent_key):
"""Get async the childs of a MainEnt"""
# stuff... yielding the query async. and raise ndb.Return()...
@ndb.tasklet
def get_created_by_async_tasklet(self, user_id):
"""Get async the MainEnt's created by user_id"""
# stuff... yielding the query async. and raise ndb.Return()...
@ndb.tasklet
def get_created_by_async_tasklet_with_childs(self, user_id):
"""Get async the MainEnt's created by user_id and its childs"""
# stuff... yielding the query async. calling get_childs.. and raise ndb.Return()...
@ndb.tasklet
def get_voted_by_async_tasklet(self, user_id):
"""Get async the MainEnt's voted by user_id"""
# stuff... yielding the query async raise ndb.Return()...
@ndb.tasklet
def get_voted_by_async_tasklet_with_childs(self, user_id):
"""Get async the MainEnt's voted by user_id and it's childs"""
# stuff... yielding the query async, calling get_childs.. and raise ndb.Return()...
@ndb.tasklet
def get_created_and_voted_by_async_tasklet(self, user_id):
"""yield get_created_by_async_tasklet and get_voted_by_async_tasklet in parallel"""
# stuff... yielding the other two functions and return results...
class ChildEnt(ndb.Model):
name = ndb.StringProperty()
如您所见,MainEnt 具有三种返回“相同”(有时更多)结果但在不同上下文中使用的方法。
1)仅当我需要获取结果时才使用同步功能,并且获得该结果是唯一的“ndb操作”。
2) async 函数仅在我需要获取结果时使用,但我还执行了一些我想要重叠的其他 ndb 查询。
3)tasklet async 函数仅在我需要获取结果、获取此结果的子实体以及可能还执行一些其他 ndb 操作时使用。
因为我发现写了太多函数......只写一个异步tasklet函数是正确的,它将在前面的每种情况下被调用??
我的意思是,即使我只需要同步结果,我也会调用 get_created_by_async_tasklet,然后在函数返回的未来调用 get_results。
这样做对性能、容易出错等有什么不便吗?我发现对于每个查询、获取等始终使用 ndb 异步小任务要简单得多……并且仅在我需要时才调用其结果,或者以其他方式执行更多异步操作,然后再调用 get_results。
希望这能得到很好的解释......
提前致谢!