Ruby on rails 如何拥有线程安全的Rails初始值设定项?

Ruby on rails 如何拥有线程安全的Rails初始值设定项?,ruby-on-rails,ruby,multithreading,thread-safety,sidekiq,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/initial

我正在考虑在我的应用程序负载较大时,将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_客户端/etc之前都实例化它们,或者使用一个连接池。

在Twitter gem repo中讨论同一主题,您认为在每次使用mixpanel/twilio_客户端/etc之前实例化它们会更好吗?如果没有,这些用例的典型解决方案是什么?是的,或者使用连接池。谢谢,我将用这个解决方案附加您的答案