2017-04-14 34 views
1

Google AppEngine搜索API可以返回asynchronous results。这些文件对这些期货说的很少,但他们有.get_result()方法,看起来很多像一个ndb.Future。我认为尝试在tasklet中使用它会很有趣:将GAE的搜索API与ndb的tasklets结合使用

@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的行为?

回答

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) 

这是超级哈克 - 我由于我使用异步搜索结果类的内部成员,所以怀疑它是官方支持的......使用需要您自担风险:-)。