gpt4 book ai didi

ruby-on-rails - 并发和 Mongoid

转载 作者:可可西里 更新时间:2023-11-01 10:06:27 24 4
gpt4 key购买 nike

我目前正在尝试使用 Rails 和 Mongoid 开发一个简单的基于网络的游戏。我遇到了一些不确定如何解决的并发问题。

问题是我不确定如何在 Mongoid 中自动进行检查并根据它采取行动。

这是 Controller 代码相关部分的示例,让您了解我正在尝试做什么:

battle = current_user.battle
battle.submitted = true
battle.save

if Battle.where(opponent: current_user._id, submitted: true, resolving: false).any?
battle.update_attribute(:resolving, true)
#Resolve turn

一场战斗在两个用户之间进行,但我只希望其中一个线程运行#Resolve 回合。现在,除非我完全关闭,否则两个线程都可以一个接一个地检查条件,但在将解析设置为 true 之前,因此两个线程最终都会运行“#Resolve turn”代码。

如果有任何关于如何解决此问题的想法,我将不胜感激。

然而,我越来越觉得以这种方式进行用户同步是相当不切实际的,而且还有更好的方法。因此,我们将不胜感激对可以完成相同事情的其他技术的建议!

最佳答案

听起来你想要 mongo findAndModify允许您以原子方式检索和更新行的命令。

不幸的是,mongoid 似乎没有公开 mongo api 的这一部分,因此看起来您必须下降到驱动程序级别才能获得这一点:

battle = Battle.collection.find_and_modify(query: {oppenent: current_user._id, ...},
update: {'$set' => {resolving: true})

默认情况下,返回的对象包含所做的修改,但如果需要,您可以打开它(pass {:new => true})

返回的值是一个原始散列,如果我没记错的话你可以执行 Battle.instantiate(doc) 来获取一个 Battle 对象。

关于ruby-on-rails - 并发和 Mongoid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10370600/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com