我正在用Python,gevent和django-socketio構建多人紙牌遊戲,我想知道維持狀態的最佳方法,記住會有多個客戶端立即連接並執行任務。多線程的安全客觀多人遊戲狀態
我使用Redis作爲遊戲位的數據存儲,光線對象模型位於頂部(Redisco)。
我很擔心防禦競爭條件,因此保持遊戲狀態安全並與許多一次嘗試做事的客戶保持一致。我認爲我的主要選擇是:
(1) - 確保所有操作都是安全的,同時一個客戶端同時處理更多事務(例如,玩家只能與自己的玩家模型的某些屬性進行交互,並且通過另一個線程或者其他任何東西有一些目標遊戲狀態。) (2) - 使用帶有某個全局鎖定的隊列來確保客戶端操作全部以特定的保證順序進行,並且在下一個開始之前完成。
我正在使用Python,Django,django-socketio,gevent,但認爲這適用更廣泛。
這是人們所說的「線程安全」嗎?
我想理論上我認爲我更喜歡(1)的想法,並且我認爲我可以通過一次修改單個Redis鍵或安全的原子操作集來確保安全操作,但是我想我要麼需要拋棄Redisco模型,要麼在理解事物何時被保存和寫入時非常小心。我認爲對於我們中的幾個人來說,這很好,但在代碼庫中有更多的人可能會長期處於危險境地。
謝謝!
這是沒有一個真正的答案的那些真正的好問題之一。線程安全的想法是防止「原子」操作混亂,聽起來您對此有一些想法,但仍然存在比較普遍的遊戲行爲競爭條件問題。如果你仔細想想,這就是像Bungie和Blizzard這樣的確切問題組織通過構建客戶端預測來解決(取得不同程度的成功),以及導致在線玩時大部分「wtf」的相同問題。如果兩個人同時開槍,誰死?取決於延遲。 – dokkaebi