Ruby 中的线程局部实例局部变量

克里斯

我想要一个线程本地(在 Rails 应用程序的上下文中,每个请求),实例本地 var,例如假设我有一个可全局访问的对象的实例。

module Event
  def self.bus
    @bus ||= Bus.new
  end
end

bus对象可以为每个请求设置元数据:

class Bus
  def with_metadata(metadata, &block)
    @metadata = metadata
    block.call
  end

  # ...
end

问题在于,在线程环境中,例如 Puma 上的 Rails 应用程序,@metadata在不同线程(即请求)之间全局共享,因此如果元数据包含 IP 地址,例如,它仅对某些请求是不正确的。

我们可以使用Thread.current哪个是线程本地的:

class Bus
  def with_metadata(metadata, &block)
    Thread.current["with_metadata"] = metadata
    block.call
  ensure
    Thread.current["with_metadata"] = nil
  end

  # ...
end

然而,这引入了一个问题,如果总线对象的另一个实例在同一个线程中初始化,即Event.busBus.new,它们错误地共享“with_metadata”状态。

我的想法是object_id在密钥中包含:

class Bus
  def with_metadata(metadata, &block)
    Thread.current["#{object_id}_with_metadata"] = metadata
    block.call
  ensure
    Thread.current["#{object_id}_with_metadata"] = nil
  end

  # ...
end

这听起来合理吗,是否有一种惯用的方式来拥有线程本地、实例本地 var?我不想依赖 Rails 或任何其他库。

霍尔格·贾斯特

Rails 依赖于concurrent-ruby gem,它为您提供了许多工具来处理多线程和并发环境。

具体来说,您可以在Concurrent::ThreadLocalVar此处使用该类:

class Bus
  def initialize
    @metadata = Concurrent::ThreadLocalVar.new
  end

  def metadata
    @metadata.value
  end

  def with_metadata(metadata, &block)
    @metadata.value = metadata
    yield
  ensure
    @metadata.value = nil
  end

  # ...
end

有关更多使用示例,请参阅上面链接的文档。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

关于attr_accessor的ruby,实例变量,局部变量

来自分类Dev

Ruby局部变量的行为遮盖了实例方法

来自分类Dev

基于Ruby中语法的未定义局部变量

来自分类Dev

Ruby on Rails中的局部变量未定义

来自分类Dev

如何在Ruby中编写内联块以包含局部变量作用域?

来自分类Dev

在Ruby中具有相同名称的局部变量和方法?

来自分类Dev

NameError:未定义-在Ruby 2.1.2中是否更改了局部变量的解析规则?

来自分类Dev

外部文件中的未定义局部变量(“为什么要对Ruby进行Poignant指南”)

来自分类Dev

Ruby 需要导致未定义的局部变量

来自分类Dev

Ruby-与obj的本征类共享局部变量

来自分类Dev

Ruby on Rails呈现部分未定义的局部变量

来自分类Dev

Ruby编程错误(未定义的局部变量)

来自分类Dev

Ruby on Rails的未定义局部变量或方法`profile'

来自分类Dev

Ruby on Rails错误:未定义的局部变量或方法

来自分类Dev

Ruby def 函数无法定义局部变量

来自分类Dev

将 ruby 哈希转换为局部变量

来自分类Dev

在OpenMP中重置线程局部变量

来自分类Java

什么是线程中的局部变量?

来自分类Dev

仅具有局部变量的实例方法的线程安全

来自分类Dev

Git Shell Ruby Bundler错误解析“ Gemfile”:未定义的局部变量或方法“ ?? g”

来自分类Dev

是否可以从Ruby的堆栈跟踪中提取局部变量及其值?

来自分类Dev

未定义的局部变量或带有response_with的方法(Ruby on Rails)

来自分类Dev

定义了一个Ruby NameError,未定义的局部变量

来自分类Dev

Ruby MRI中的线程安全实例变量

来自分类Dev

为什么您可以使用其他方法而不使用赋值运算符在函数中更改Ruby中局部变量的值?

来自分类Java

为什么局部变量在Java中是线程安全的

来自分类Java

Java中是否有线程组局部变量?

来自分类Java

静态方法和线程安全中的局部变量

来自分类Dev

JVMTI Agent中的访问线程局部变量

Related 相关文章

  1. 1

    关于attr_accessor的ruby,实例变量,局部变量

  2. 2

    Ruby局部变量的行为遮盖了实例方法

  3. 3

    基于Ruby中语法的未定义局部变量

  4. 4

    Ruby on Rails中的局部变量未定义

  5. 5

    如何在Ruby中编写内联块以包含局部变量作用域?

  6. 6

    在Ruby中具有相同名称的局部变量和方法?

  7. 7

    NameError:未定义-在Ruby 2.1.2中是否更改了局部变量的解析规则?

  8. 8

    外部文件中的未定义局部变量(“为什么要对Ruby进行Poignant指南”)

  9. 9

    Ruby 需要导致未定义的局部变量

  10. 10

    Ruby-与obj的本征类共享局部变量

  11. 11

    Ruby on Rails呈现部分未定义的局部变量

  12. 12

    Ruby编程错误(未定义的局部变量)

  13. 13

    Ruby on Rails的未定义局部变量或方法`profile'

  14. 14

    Ruby on Rails错误:未定义的局部变量或方法

  15. 15

    Ruby def 函数无法定义局部变量

  16. 16

    将 ruby 哈希转换为局部变量

  17. 17

    在OpenMP中重置线程局部变量

  18. 18

    什么是线程中的局部变量?

  19. 19

    仅具有局部变量的实例方法的线程安全

  20. 20

    Git Shell Ruby Bundler错误解析“ Gemfile”:未定义的局部变量或方法“ ?? g”

  21. 21

    是否可以从Ruby的堆栈跟踪中提取局部变量及其值?

  22. 22

    未定义的局部变量或带有response_with的方法(Ruby on Rails)

  23. 23

    定义了一个Ruby NameError,未定义的局部变量

  24. 24

    Ruby MRI中的线程安全实例变量

  25. 25

    为什么您可以使用其他方法而不使用赋值运算符在函数中更改Ruby中局部变量的值?

  26. 26

    为什么局部变量在Java中是线程安全的

  27. 27

    Java中是否有线程组局部变量?

  28. 28

    静态方法和线程安全中的局部变量

  29. 29

    JVMTI Agent中的访问线程局部变量

热门标签

归档