Python、gevent、およびdjango-socketioを使用してマルチプレイヤーカードゲームを構築しています.一度に複数のクライアントが接続して物事を行うことを念頭に置いて、物事の状態を維持する最良の方法について疑問に思っています.
ゲーム内ビットのデータストアとしてRedisを使用しており、その上にライトオブジェクトモデルがあります(Redisco at the mo)。
私は、競合状態に対する防御と、それによってゲームの状態を安全に保ち、一度に何かをしようとする多くのクライアントとの一貫性を維持することに関心があります。私の主なオプションは次のとおりだと思います。
(1) - 複数のクライアントが一度に処理を行っても、すべての操作が安全であることを確認します (たとえば、プレーヤーは自分のプレーヤー モデルの特定のプロパティとしか対話できず、別のスレッドまたは何かを実行する何かを介して客観的なゲーム状態が存在するなど) else.) (2) - グローバル ロックを持つキューを使用して、すべてのクライアント操作が特定の保証された順序で発生し、次の操作が開始される前に 1 つが終了するようにします。
私は Python、Django、django-socketio、gevent を使用していますが、これはより広く適用されると思います。
これは、人々が言及する「スレッドセーフ」なことですか?
理論的には、(1) の考え方を好むと思います。一度に 1 つの Redis キーを変更するか、アトミック操作の安全なセットを変更するだけで、安全な操作を確保できると思いますが、どちらかが必要だと思います。 Redisco モデルを捨てるか、物事がいつ保存されて書き込まれるかを理解することに細心の注意を払う必要があります。数人だけで作業している場合は問題ないと思いますが、コードベースにさらに多くの人が参加すると、長期的には危険になる可能性があります。
ありがとう!