Объединение ndb.Tasklets с чтением memcache - PullRequest
2 голосов
/ 02 апреля 2012

Скажем, я хочу прочитать следующую структуру объекта и максимально распараллелить чтение:

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

1) Имеет ли смысл взаимодействовать с memcache и / или store для получения ShardCountersиз тасклетов?Насколько я вижу, в memcache нет get_async, поэтому я немного не уверен, будет ли это хорошо распараллеливаться?

2) В тасклете, который выдает результаты для SubObject2Могу ли я использовать шаблон iter.has_next_async() или позвонить fecth_async().map(...), чтобы получить SubObject3, или что-то совсем другое (например, другой тасклет)?

Спасибо за любые указатели.

Ответы [ 2 ]

7 голосов
/ 03 апреля 2012

NDB имеет автоматическую пакетную асинхронную запись memcache apis для объекта Context.См https://developers.google.com/appengine/docs/python/ndb/contextclass.

3 голосов
/ 02 апреля 2012

Хотя асинхронные функции для memcache не определены на верхнем уровне, класс Client имеет асинхронные функции, как описано здесь , которые вы можете использовать с NDB и тасклетами. NDB не сможет объединить несколько асинхронных операций получения в одно множественное получение, поэтому, в зависимости от того, что вы делаете, вместо этого может быть более эффективным сделать get_multi. Изменить: NDB имеет интерфейс Memcache - подробности см. В ответе Гвидо.

Что касается вашего второго вопроса, вам нужно будет немного рассказать о том, что вы делаете с результатами и почему, и как вы видите альтернативы. Если все, что вам нужно сделать, это получить все асинхронные результаты, вы можете просто получить их все в одном выражении.

...