繁体   English   中英

如何从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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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