简体   繁体   中英

How to get isolated thread information from Puma

I have a Rails application using Puma.

The Puma configuration is:

workers 2
threads 1, 16
app_dir = File.expand_path("../..", __FILE__)
tmp_dir = "#{app_dir}/tmp"
rails_env = ENV['RAILS_ENV'] || "development"
environment rails_env
daemonize
bind "unix://#{tmp_dir}/sockets/puma.sock"
stdout_redirect "log/puma.stdout.log", "log/puma.stderr.log", true
pidfile "#{tmp_dir}/pids/puma.pid"
state_path "#{tmp_dir}/pids/puma.state"

When two requests have one pid, they have a common state.

For example, we have a simple singleton:

class Test
  include Singleton
  attr_accessor :field
end

The first request sets:

Test.instance.field = 'from_first_request'

In the second request we see:

puts(Test.instance.field) # => 'from_first_request'

Is this the correct behaviour? Can we get the isolated state for any requests on one pid?

If you use Rails 5.0 you can also use new thread specific variable, like this:

class SomeSingleton
  thread_mattr_accessor :field
end

If your Rails version < 5.0 you're still able to store field in Thread.current, like this:

class SomeSingleton
  def self.field=(field)
    Thread.current[:field] = field
  end

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

Let me know if it helped.

您也可以使用request_store gem。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM