Google AppEngine搜索API可以返回asynchronous results。文档对这些未来很少说,但它们确实有一个.get_result()
方法,它看起来像<{3}}一样很多。我认为尝试在tasklet中使用它会很有趣:
@ndb.tasklet
def async_query(index):
results = yield [index.search_async('foo'), index.search_async('bar')]
raise ndb.Return(results)
不幸的是,这不起作用。 ndb
并不喜欢这样,因为搜索API返回的未来似乎与ndb.Future
不兼容。但是,tasklet文档还特别提到它们已经与ndb.Future
一起使用。有没有办法在搜索API中获得类似的行为?
答案 0 :(得分:1)
事实证明,是一种使这项工作的方法(至少,我对dev_appserver的测试似乎正在传递; - )。
@ndb.tasklet
def async_query(index, query):
fut = index.search_async(query)
yield fut._rpc
raise ndb.Return(fut._get_result_hook())
现在,如果我想进行多个查询并混合一些数据存储查询(也就是说我可能使用搜索API来获取模型实体的ID),
@ndb.tasklet
def get_entities(queries):
search_results = yield [async_query(q) for q in queries]
ids = set()
for search_result in search_results:
for doc in search_results.results:
ids.add(doc.doc_id)
entities = yield [FooModel.get_by_id_async(id_) for id_ in ids_]
raise ndb.Return(entities)
这是超级hacky - 我怀疑它是正式支持的,因为我使用异步搜索结果类的内部成员...使用风险: - )。