Python 多线程安全目标多人游戏状态

Python 多线程安全目标多人游戏状态,python,django,redis,multiplayer,gevent,Python,Django,Redis,Multiplayer,Gevent,我正在用Python、gevent和django socketio构建一个多人纸牌游戏,我想知道维护事物状态的最佳方法,记住将有多个客户端同时连接并执行操作 我使用Redis作为游戏中的数据存储,上面有轻对象模型(mo的Redisco) 我关心的是如何抵御比赛条件,从而保持比赛状态的安全性,并与众多试图同时完成任务的客户保持一致。我认为我的主要选择是: (1) -确保所有操作都是安全的,有多个客户端同时执行操作(例如,一个玩家只能与自己玩家模型的某些属性进行交互,并且通过另一个线程或其他执行任何

我正在用Python、gevent和django socketio构建一个多人纸牌游戏,我想知道维护事物状态的最佳方法,记住将有多个客户端同时连接并执行操作

我使用Redis作为游戏中的数据存储,上面有轻对象模型(mo的Redisco)

我关心的是如何抵御比赛条件,从而保持比赛状态的安全性,并与众多试图同时完成任务的客户保持一致。我认为我的主要选择是:

(1) -确保所有操作都是安全的,有多个客户端同时执行操作(例如,一个玩家只能与自己玩家模型的某些属性进行交互,并且通过另一个线程或其他执行任何操作的对象存在某种客观的游戏状态。) (2) -使用带有全局锁的队列,以确保客户端操作都以一定的保证顺序进行,并且在下一个操作开始之前完成

我正在使用Python、Django、Django socketio、gevent,但我认为这适用范围更广

这就是人们所说的“线程安全”吗

我想理论上我更喜欢(1)的想法,我认为我可以通过一次修改一个Redis密钥或安全的原子操作集来确保安全操作,但我想我要么需要扔掉Redisco模型,要么在保存和写入内容时非常小心地理解。我认为这对我们中的一些人来说是很好的,但是如果代码库中有更多的人,从长远来看,这可能是危险的


谢谢

您已经很好地描述了您的选项。可能需要将这两种方法结合起来

  • 确保共享状态尽可能少
  • 使用队列修改剩余的共享状态

  • 你已经很好地描述了你的选择。可能需要将这两种方法结合起来

  • 确保共享状态尽可能少
  • 使用队列修改剩余的共享状态

  • 这是一个非常好的问题,没有一个真正的答案。线程安全的思想是防止“原子”操作混乱,听起来你对此有一些想法,但仍然存在游戏动作竞赛条件的更普遍问题。如果你仔细想想,这就是Bungie和Blizzard这样的问题组通过构建客户端预测来解决的问题(取得了不同程度的成功),同样的问题在在线游戏时也会导致大多数“wtf”。如果两个人同时开枪,谁会死?取决于延迟。这是一个没有真实答案的好问题。线程安全的思想是防止“原子”操作混乱,听起来你对此有一些想法,但仍然存在游戏动作竞赛条件的更普遍问题。如果你仔细想想,这就是Bungie和Blizzard这样的问题组通过构建客户端预测来解决的问题(取得了不同程度的成功),同样的问题在在线游戏时也会导致大多数“wtf”。如果两个人同时开枪,谁会死?取决于延迟。