ruby-on-rails - 如何拥有线程安全的 Rails 初始化器?

标签 ruby-on-rails ruby multithreading thread-safety sidekiq

当我的应用程序负载较大时,我正在考虑将 Rails 应用程序切换到 Sidekiq 和 Puma。但是,它们要求应用程序是线程安全的。

通常被认为不是线程安全的事物之一是全局变量。但我的应用程序使用 Rails 应用程序和教程中的常见模式,您可以在初始化程序中定义全局变量,如下所示:

# config/initializers/aws.rb
...
$s3_bucket = Aws::S3::Resource.new.bucket(ENV['AWS_S3_BUCKET'])

# config/initializers/mixpanel.rb
$mixpanel = Mixpanel::Tracker.new(ENV['MIXPANEL_TOKEN']) do |*message|
  ...
end

# config/initializers/redis.rb
$redis = Redis.new(host: ENV['REDIS_HOST'], port: ENV['REDIS_PORT'])

# config/initializers/twilio.rb
$twilio_client = Twilio::REST::Client.new(ENV['TWILIO_ACCOUNT_SID'], ENV['TWILIO_AUTH_TOKEN'])

我喜欢这种方法,因为代码库的其余部分可以非常轻松地使用这些变量,并且使其更加简洁。

但是这些全局变量是线程安全的吗?如果没有,我有什么选择?我更愿意使用一种仍能让代码库易于阅读的解决方案。

最佳答案

初始化程序在创建其他线程之前在主线程中运行。它们可能是线程不安全的。

更好的解决方案是每次使用 mixpanel/twilio_client/etc 之前都实例化它们,或者使用连接池。

关于ruby-on-rails - 如何拥有线程安全的 Rails 初始化器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34973188/

相关文章:

python - 我如何在 python 中将整数转换为 'binary'

ruby - Nokogiri 在解析期间剥离属性命名空间

ruby-on-rails - 没有 Rails 的事件记录 : How to pass an Arbitrary hash to Active Record

sql - 在 Ruby on Rails 中连接 SQL 服务器

ruby-on-rails - 从相同的 SGID 加载 ActionText::Attachable 在恢复数据库后不再有效

ruby-on-rails - 部署到 Heroku 时的不同页面外观

arrays - 将数组数组转换为 Ruby 中的哈希数组

multithreading - 扭曲/ Tornado 等如何工作

java - 重用 Runnable 的最佳方式

C++11 线程 boost 容器