如何从 Puma 获取隔离线程信息
How to get isolated thread information from Puma
我有一个使用 Puma 的 Rails 应用程序。
Puma 配置为:
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"
当两个请求有一个 pid 时,它们有一个共同的状态。
比如我们有一个简单的单例:
class Test
include Singleton
attr_accessor :field
end
第一个请求集:
Test.instance.field = 'from_first_request'
在第二个请求中我们看到:
puts(Test.instance.field) # => 'from_first_request'
这是正确的行为吗?我们可以为一个 pid 上的任何请求获取隔离状态吗?
如果您使用 Rails 5.0,您还可以使用新的线程特定变量,如下所示:
class SomeSingleton
thread_mattr_accessor :field
end
如果您的 Rails 版本 < 5.0,您仍然可以在 Thread.current 中存储字段,如下所示:
class SomeSingleton
def self.field=(field)
Thread.current[:field] = field
end
def self.field
Thread.current[:field]
end
end
如果有帮助请告诉我。
您也可以使用 request_store gem.
我有一个使用 Puma 的 Rails 应用程序。
Puma 配置为:
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"
当两个请求有一个 pid 时,它们有一个共同的状态。
比如我们有一个简单的单例:
class Test
include Singleton
attr_accessor :field
end
第一个请求集:
Test.instance.field = 'from_first_request'
在第二个请求中我们看到:
puts(Test.instance.field) # => 'from_first_request'
这是正确的行为吗?我们可以为一个 pid 上的任何请求获取隔离状态吗?
如果您使用 Rails 5.0,您还可以使用新的线程特定变量,如下所示:
class SomeSingleton
thread_mattr_accessor :field
end
如果您的 Rails 版本 < 5.0,您仍然可以在 Thread.current 中存储字段,如下所示:
class SomeSingleton
def self.field=(field)
Thread.current[:field] = field
end
def self.field
Thread.current[:field]
end
end
如果有帮助请告诉我。
您也可以使用 request_store gem.