当我的应用程序负载较大时,我正在考虑将 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/