将ndb.Tasklets与memcache读取相结合

时间:2012-04-02 15:15:37

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

假设我想阅读以下对象结构,并希望尽可能并行化读取:

root_object --> ShardCounter
            |
             -> SubObject1 (1..N)
            |
             -> SubObject2 (1..N) --> ShardCounter
                                  |
                                   -> SubObject3 (1..N)

1)与memcache和/或商店交互以从tasklets中获取ShardCounters是否有意义?据我所知,memcache没有get_async,所以我不确定这是否会很好地并行化?

2)在生成SubObject2结果的tasklet中,我会使用iter.has_next_async()模式,还是会调用fecth_async().map(...)来检索SubObject3,或者完全不同的东西(例如另一个tasklet)?

感谢您的任何指示。

2 个答案:

答案 0 :(得分:7)

NDB 在Context对象上具有自动批处理异步memcache apis。请参阅https://developers.google.com/appengine/docs/python/ndb/contextclass

答案 1 :(得分:3)

尽管在顶层没有定义memcache的异步函数,但Client类具有异步函数,如文档here所示,您可以将其与NDB和tasklet一起使用。但是,NDB将无法将多个异步获取操作组合到一个多重获取中,因此根据您正在执行的操作,执行get_multi可能更有效。编辑:NDB确实有一个Memcache界面 - 有关详细信息,请参阅Guido的答案。

对于你的第二个问题,你必须详细说明你正在做什么的结果和原因,以及你看到的替代方案。如果你只需要获取所有异步结果,你可以在一个语句中完成它们。