2

次の Guido の指示に従って、memcached の比較と設定のパターンを実装しようとしています。

http://neopythonic.blogspot.nl/2011/08/compare-and-set-in-memcache.html

しかし、私はそれを正しく理解していないようで、何が問題なのかわかりません。以下のファイルは、Django (1.4.5 Final) と python-memcache (1.48) を使用しています。

設定.py

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
    }
}

djangocache.py

#!/usr/bin/env python
from django.core.cache import cache
import multiprocessing.dummy

django_key = "TEST"
cached_key = cache.make_key(django_key).encode("UTF-8")

def add_to_cache(item):
    client = cache._cache
    #client = cache._lib.Client(cache._servers)

    while True:
        items = client.gets(cached_key)
        if client.cas(cached_key, items+(item,)):
            break

if __name__ == "__main__":
    cache.set(django_key, ())

    p = multiprocessing.dummy.Pool(2)
    p.map(add_to_cache, range(10))
    print(len(cache.get(django_key)))

それを実行する:

mzialla@Q330 ~/test $ DJANGO_SETTINGS_MODULE=settings python djangocache.py
5

競合状態を処理するときに予想されるように、6、7 などを出力することがあります。複数のクライアントのインスタンス化を試みました (コメントを参照)。

ヘルプ?

4

1 に答える 1

3

python-memcached はデフォルトで cas を無効にします。追加して有効にする

 client.cache_cas = True

あなたのコードに。

この質問をした直後に私が発見したコメントであるNate Thelenの功績。

于 2013-09-27T12:58:52.060 に答える