したがって、この問題はかなり複雑です。できる限り説明しようと思います。どんな助けでも大歓迎です。前もって感謝します!
tornadio2 + Memcached を使用するアプリケーションを構築していますが、キャッシュからプルしようとすると、ややこしいことがわかります。
手始めに、これが私の broadcast_to_players() 関数です。
def broadcast_to_players(self, g_id, event, message, update_secret=False, dont_update_self=False):
the_game = cache.get(g_id)
for player in the_game.player_list:
if update_secret == True:
secret = self.get_secret()
message['k'] = secret
player.secret_key = secret
if dont_update_self == True:
if not self.session_id == player.session_id:
single_session = self.session.server._sessions.get(player.session_id)
single_session.conn.emit(event, message)
else:
single_session = self.session.server._sessions.get(player.session_id)
single_session.conn.emit(event, message)
cache.set(g_id, the_game)
## FOR TESTING PURPOSES ##
if update_secret == True:
other_game = cache.get(g_id)
for player in other_game.player_list:
print "player.secret_key in broadcast_to_players = %s" % player.secret_key
ご覧のとおり、キャッシュから the_game を取得し、処理を行い、メッセージを変更し、player_list 内のプレーヤーを更新して、メッセージを送信します。次に、ゲームをキャッシュに設定します。その後、(テスト目的で) 再度取得し、各プレイヤーの secret_key 値がキャッシュに作成されたかどうかをテストします。そして、彼らはそうします。
ただし、キャッシュから同じゲームを再度取得しようとすると、secret_key = None と表示されます
def check_player(self, g_id, key):
the_game = cache.get(g_id) #I'm able to
the_player = None
for player in the_game.player_list:
if player.secret_key == key:
the_player = player
return the_player
ゲームはキャッシュされていますが、game モデルで player_list が更新されていません。これが私のゲームとプレーヤーのモデルです:
http://pastebin.com/t66qgeeb - ゲームモデル
http://pastebin.com/7FjpeSLx - プレーヤーモデル
ご覧のとおり、Player モデルは User を介して Game と多対多の関係にあります。また、Django モデル クラスに保持している (プレイ中のゲーム用の) 非永続変数が多数あります。私の推測では、自分のゲームに関連付けられているすべてのプレーヤーを取得し、それらを player_list に入れてから更新しようとしているという事実と関係があるのではないでしょうか? そして、memcached はそれほど深いコピーを行いませんか? 私にはわかりません、そして私はそれを理解しようとして頭を悩ませてきました。どんな助けでも大歓迎です。ありがとう!