を逃すためにfalseを返す続けて次のGoogleのApp Engine上で動作しているのPythonフラスコアプリケーションの一部です:私たちが作る場合は、空のキャッシュを皮切りGoogle App Engineのmemcache.Client.casは()キー
@app.route('/blabla', methods=['GET'])
def blabla():
# memcache.add('key', None) # this "fixes" it!
memcache_client = memcache.Client()
while True:
value = memcache_client.gets('key')
if value is None: # First time
updated_value = 'Bla'
else:
updated_value = value + ', bla'
if memcache_client.cas('key', updated_value):
return updated_value
/blablaに連続したGETリクエスト、私は要求が返すことを期待する:
Bla
Bla, bla
Bla, bla, bla
.
.
(キャッシュがフラッシュされます.gets()
とcas()
の間にいくつかの点でいくつかの理由であれば、私はシーケンスを再起動することを期待する、問題ありません。)
memcache_client.cas()
がFalse
を永遠に返すため、何も得られないので、プログラムはwhile
-loopでスタックされます。どうやらこれは、キー'key'
が最初に存在しないために起こります。
memcache.add('key', None)
のコメントを外すと、キーが存在し、.cas()
がうれしくてTrue
が返されるため、これは分かります。しかし、.add()
と.gets()
の間にキャッシュをフラッシュする他のプロセスがあった場合は、キーが見つからずに開始したところに戻り、.cas()
は無期限にFalse
を返します。だから、それは良い解決策ではありません。
.cas()
が最初にキーが見つからない場合はどうしたらいいですか?または、少なくとも.cas()
はinitial_value=
パラメータを兄弟のように受け入れないのですか?decr()?バグか機能ですか?私はグイド・ヴァンロッサムはassert
に-reffering彼single blog post on the matterでそれを暗示彼は.gets()
がNone
を返さないことになることを除いて、これはどこでも適切に文書を見つけることができない、と彼は言う:脇
2:アサート一種のナイーブです。実際には、カウンターの初期化に何とか対処しなければなりません。
デンジャー・ウェル・ギドー誰にも分かりますか?