gpt4 book ai didi

ruby-on-rails - Ruby 为什么类实例变量是线程安全的

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

根据 this回答是,但是张贴者说 JRuby 的工作方式不同所以我很困惑?

我正在使用类实例变量实现 Multi-Tenancy 解决方案,因此无论我使用什么 Ruby 实现或 Web 服务器,我都需要确保数据不会泄露。

这是我的代码:

class Tenant < ActiveRecord::Base

def self.current_tenant=(tenant)
@tenant = tenant
end

def self.current_tenant
@tenant
end
end

我需要做什么来确保无论发生什么(更改 Ruby 实现、更改 Web 服务器、新的 Ruby 线程功能等)我的代码都是线程安全的?

最佳答案

由于 tenancy 属性的范围是一个请求,我建议您将其保留在当前线程 的范围内。由于一个请求是在单个线程上处理的,并且一个线程一次处理一个请求 - 只要您始终在请求开始时设置租期就可以了(为了额外的安全性,您可能希望取消 -在请求结束时分配租户)。

为此,您可以使用 thread local属性:

class Tenant < ActiveRecord::Base

def self.current_tenant=(tenant)
Thread.current[:current_tenant] = tenant
end

def self.current_tenant
Thread.current[:current_tenant]
end

def self.clear_current_tenant
Thread.current[:current_tenant] = nil
end
end

由于这是使用线程存储,因此您是完全线程安全的 - 每个线程都负责自己的数据。

关于ruby-on-rails - Ruby 为什么类实例变量是线程安全的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25016632/

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