3

基於文檔物化和谷歌雲存儲,我希望在下面的代碼查詢和批量加載並行執行上:爲什麼我的查詢和批處理不能並行執行?

List<Iterable<Key<MyType>>> results = new ArrayList<>(); 
for (...) { 
    results.add(ofy().load() 
     .type(MyType.class) 
     .filter(...) 
     .keys() 
     .iterable()); 
} 
... 
Iterable<MyType> keys = ...; 
Collection<MyType> c = ofy().load().keys(keys).values(); 

但跟蹤使它看起來像每個查詢和每個實體負荷執行順序:

Trace

是怎麼回事?

回答

2

看起來像這隻發生在從Memcache緩存獲取時發生。隨着類似的代碼,我看到datastore_v3.Get /認沽預期的異步行爲/刪除:

datastore_v3.Get datastore_v3.Put datastore_v3.Delete

看來這樣做的原因是,客體不使用AsyncMemcacheService。事實上,在項目頁面上有一個open issue,這也可以通過檢查源代碼並執行grep -r AsyncMemcacheService來確認。關於串行datastore_v3.RunQuery調用,調用ofy().load().type(...)。filter(...)。iterable()是'異步',因爲它們是return immediately,但是實際的數據存儲查詢本身將作爲App Engine數據存儲API doesn't expose an explicitly async API for queries串行執行。

相關問題