ruby-on-rails - 如何从 Puma 获取隔离线程信息

标签 ruby-on-rails ruby 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

如果有帮助,请告诉我。

关于ruby-on-rails - 如何从 Puma 获取隔离线程信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40939845/

相关文章:

ruby-on-rails - Ruby on Rails 继承语法

ruby - 使用 Sinatra 更改 HTTP 状态消息

ruby-on-rails - 当我返回菜单页面时,背景图像未显示

ruby-on-rails - ruby-debug安装错误: failed to build gem native extension

ruby-on-rails - rails : Custom validations using ActiveModel

ruby-on-rails - 使用包含多个关联和单独的条件

ruby-on-rails - Ruby 中的异常处理 - 如果需要救援,则调用 begin

ruby - 在 rackup 文件中设置服务器选项

ruby-on-rails - Rails 使用 puma,更改 localhost :3000 to localhost:3000/example

ruby-on-rails - 使用 Puma 部署在 Elastic Beanstalk 上的 Rails 应用程序失败 - 每个请求都出现 502 错误