我正在用 Python、gevent 和 django-socketio 构建一个多人纸牌游戏,我想知道保持事物状态的最佳方式,记住会有多个客户端同时连接并做事。
我使用 Redis 作为游戏中位的数据存储,顶部有光对象模型(Redisco at the mo)。
我担心如何防御竞争条件,从而保持游戏状态的安全,并与这么多试图同时做事的客户保持一致。我认为我的主要选择是:
(1) - 确保所有操作都是安全的,同时有多个客户端同时执行操作(例如,玩家只能与他们自己的玩家模型的某些属性进行交互,并且通过另一个线程或某些可以执行任何操作的东西存在一些客观的游戏状态否则。) (2) - 使用带有一些全局锁的队列来确保客户端操作都以一定的保证顺序发生,并且一个在下一个开始之前完成。
我正在使用 Python、Django、django-socketio、gevent,但认为这适用更广泛。
这是人们所说的“线程安全”吗?
我想理论上我认为我更喜欢(1)的想法,并且我认为我可以通过一次只修改一个 Redis 键或一组安全的原子操作来确保安全操作,但我想我要么需要扔掉 Redisco 模型,或者在保存和写入内容时要非常小心地理解。我认为这对我们中的几个人来说很好,但从长远来看,代码库中有更多人可能会很危险。
谢谢!