【问题标题】:Using GAE's search API with ndb's tasklets将 GAE 的搜索 API 与 ndb 的小任务一起使用
【发布时间】:2017-04-14 19:43:04
【问题描述】:
Google AppEngine 搜索 API 可以返回 asynchronous results。文档很少提及这些期货,但他们确实有一个 .get_result() 方法,看起来很多类似于 ndb.Future。我认为尝试在 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 文档还特别提到它们已与urlfetch futures 一起使用。有没有办法通过搜索 api 获得类似的行为?
【问题讨论】:
标签:
python
google-app-engine
app-engine-ndb
【解决方案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)
这太老套了——我怀疑它是否得到官方支持,因为我使用的是异步搜索结果类的内部成员......使用风险自负:-)。