【问题标题】: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)
    

    这太老套了——我怀疑它是否得到官方支持,因为我使用的是异步搜索结果类的内部成员......使用风险自负:-)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-21
      • 2013-11-22
      相关资源
      最近更新 更多