2016-01-24 36 views
1

我想在我的應用程序獲得一些重要的負載時將我的Rails應用程序切換到Sidekiq和Puma。但是,它們需要應用程序是線程安全的。如何擁有線程安全的Rails初始化器?

通常被認爲不是線程安全的事情之一是全局變量。但是我的應用程序將使用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']) 

我喜歡這種方法,因爲代碼庫的其他部分可以很容易地使用這些變量,它使它變得更加爽朗。

但是這些全局變量是線程安全的嗎?如果不是,我有什麼選擇?我最好使用一個仍然保持代碼庫容易閱讀的解決方案。

+0

關於Twitter中同一主題的討論gem repo https://github.com/sferik/twitter/issues/131 –

回答

2

在創建其他線程之前,初始化程序在主線程中運行。他們可能是線程不安全的。

更好的解決方案是在每次使用它們之前實例化mixpanel/twilio_client/etc或使用連接池。

+0

在使用它們之前,每次都會實例化mixpanel/twlio_client/etc在您看來會更好嗎?如果不是,這些用例的典型解決方案是什麼? –

+0

是或使用連接池。 –

+0

謝謝,我將附上您的答案與此解決方案 –

相關問題