3

私のプログラムは、異なる ndb.Key.get() 呼び出しが同じモデル インスタンスを受け取るように、NDB コンテキスト キャッシュに依存しています。

しかし、これは非同期取得では正しく機能しないことがわかりました。予想される動作は、NDB のバッチャーがリクエストを組み合わせて同じモデル インスタンスを返すことですが、そうはなりません。

この問題は、memcache が有効になっている場合にのみ発生しますが、これも奇妙です。

テスト ケースを次に示します (2 回実行します)。

class Entity(ndb.Model):
    pass

# Disabling memcache fixes the issue
# Entity._use_memcache = False

entity_key = ndb.Key('Entity', 1)

# Set up entity in datastore and memcache on first run
if not entity_key.get():
    entity = Entity(key=entity_key)
    entity.put()

    return

# Clear cache after Key.get() above
ndb.get_context().clear_cache()

# Entity is now in memcache and datastore but not context

entity_future_a = entity_key.get_async()
entity_future_b = entity_key.get_async()

entity_a = entity_future_a.get_result()
entity_b = entity_future_b.get_result()

# FAILS
assert entity_a is entity_b

これまでのところ、ローカル SDK でのみこれをテストしました。

4

1 に答える 1

1

そこでyieldを呼び出していないために、これが発生している可能性があります。使えるように環境を整えてみませんか?

entity_a, entity_b = yield entity_future_a, entity_b_future

?

于 2013-09-19T21:08:54.427 に答える