使用GAE的搜索API和ndb的tasklet

时间:2017-04-14 19:43:05

标签: python google-app-engine app-engine-ndb

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中获得类似的行为?

1 个答案:

答案 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 - 我怀疑它是正式支持的,因为我使用异步搜索结果类的内部成员...使用风险: - )。