2017-04-14 40 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) 

這是超級哈克 - 我由於我使用異步搜索結果類的內部成員,所以懷疑它是官方支持的......使用需要您自擔風險:-)。