2015-01-05 4 views
1

Я пытаюсь использовать memcached с Google App Engine. Я импортировать библиотеку с помощьюAttributeError при использовании memcache.gets()

from google.appengine.api import memcache

, а затем вызвать его с помощью

posts = memcache.gets("posts")

Затем я получаю следующее сообщение об ошибке: AttributeError: 'module' object has no attribute 'gets'

Я просмотрел документацию в Google App Engine в отношении memcache, но я не могу найти примеры с помощью memcache.gets(). Кажется, что Memcache.get() используется так, как я называю get above.

ответ

2

gets является метод объекта memcache клиента, не функциональный модуль уровня memcache. Функции уровня модуля довольно просты, не имеют аналогов и синхронны; используя клиентский объект, вы можете сделать более продвинутый материал, если это необходимо, как описано в https://cloud.google.com/appengine/docs/python/memcache/clientclass.

В частности, согласно документации на https://cloud.google.com/appengine/docs/python/memcache/clientclass#Client_gets, «Вы можете использовать» gets «, а не get, если вы хотите, чтобы избежать условий, в которых два или более абонентов пытаются изменить то же самое ключевое значение в то же время, что приводит к нежелательным перезаписей «. поскольку gets также получает (и stashes в объекте клиента) cas_id, который позволяет использовать вызов cas (сравнение и набор) (вам не нужно явно обращаться с cas_id).

Поскольку, похоже, вы не пытаетесь выполнить операцию сравнения и установки, я бы рекомендовал использовать более простую функцию уровня модуля get, а не создавать экземпляр объекта-клиента и использовать его метод экземпляра gets.

0

Если вы на самом деле сделать необходимость сравнения и установить, очень хорошее объяснение можно найти here:

The Client object is required because the gets() operation actually squirrels away some hidden information that is used by the subsequent cas() operation. Because the memcache functions are stateless (meaning they don't alter any global values), these operations are only available as methods on the Client object, not as functions in the memcache module. (Apart from these two, the methods on the Client object are exactly the same as the functions in the module, as you can tell by comparing the documentation.)

Решение будет использовать класс:

client = memcache.Client() 
posts = client.gets("posts") 
... 
client.cas("posts", "new_value") 

Хотя, конечно, вам понадобится больше, чем для того, чтобы cas был полезен.

Смежные вопросы