gpt4 book ai didi

ruby - ActiveRecord 模型的互斥锁

转载 作者:数据小太阳 更新时间:2023-10-29 06:52:59 25 4
gpt4 key购买 nike

我的用户模型有一个讨厌的方法,不应该为同一记录的两个实例同时调用。我需要连续执行两个 http 请求,同时确保任何其他线程不会同时对同一记录执行相同的方法。

class User
...
def nasty_long_running_method
// something nasty will happen if this method is called simultaneously
// for two instances of the same record and the later one finishes http_request_1
// before the first one finishes http_request_2.
http_request_1 // Takes 1-3 seconds.
http_request_2 // Takes 1-3 seconds.
update_model
end
end

例如这会破坏一切:

user = User.first
Thread.new { user.nasty_long_running_method }
Thread.new { user.nasty_long_running_method }

但这没关系,应该被允许:

user1 = User.find(1)
user2 = User.find(2)
Thread.new { user1.nasty_long_running_method }
Thread.new { user2.nasty_long_running_method }

确保同一记录的两个实例不会同时调用该方法的最佳方法是什么?

最佳答案

我找到了一颗 gem Remote lock在为我的问题寻找解决方案时。它是一种在后端使用 Redis 的互斥锁解决方案。

它:

  • 所有进程都可以访问
  • 不锁定数据库
  • 在内存中 -> 快速且无 IO

这个方法现在看起来像这样

def nasty
$lock = RemoteLock.new(RemoteLock::Adapters::Redis.new(REDIS))
$lock.synchronize("capi_lock_#{user_id}") do
http_request_1
http_request_2
update_user
end
end

关于ruby - ActiveRecord 模型的互斥锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24567108/

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