ruby - 在 jruby 线程之间和 Rack 应用程序内部共享全局引用

标签 ruby multithreading jruby

我正在尝试创建一个统计计数器(类似于 Twitter 的 ostrich for scala 中的计数器),但很难确保我的所有线程都可以访问它。我的统计类定义如下:

class Stats
  @@counters = {}
  .. accessors ..

  def self.incr(counter, amt = 1)
    if !@@counters[counter]  
      @@counters[counter] = java.util.concurrent.atomic.AtomicInteger.new()
    end
    @@counters[counter].getAndAdd(amt)
  end
end

我知道计数器哈希本身的线程安全性存在一些问题。如果我手动创建线程,它们似乎能够全局访问 Stats.counters,但我正在尝试创建一个 rackup 应用程序(Sinatra,使用 jetty-rackup 嵌入 Jetty 中)来显示此信息,并在该 Sinatra 应用程序中显示此信息统计为空。是否有一种好方法可以与应用程序的其他部分共享此计数器,或者 sinatra 是否正在做一些清除全局变量范围的事情?

最佳答案

我们在 IRC#jruby 上讨论了这个问题,但在这里只是为了后代重申,我最好的猜测是你遇到了这样一种情况,jetty-rackup 正在创建和汇集多个运行时以用于服务请求。这些运行时中的每一个都加载了相同的 Ruby 代码,但彼此不知道,类似于多个 Ruby 进程。您有很多选项可以在它们之间共享状态。

  • 使用 Java 类(带有单例实例或静态方法/字段)
  • 使用专门构建的 Java 内存缓存库
  • 使用 Java Servlet session
  • 使用外部机制(memcached、DB 等)
  • 还有很多

关于ruby - 在 jruby 线程之间和 Rack 应用程序内部共享全局引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3441079/

相关文章:

ios - 我可以将 iOS Info.plist 转换为 ruby​​ 哈希吗?

ruby-on-rails - Rails,如何制作记录上次访问时间的数据库模型

Java——等待方法未退出

Java多线程问题——消费者/生产者模式

java - 从(例如)JRuby irb 内部访问 jar 文件中定义的类?

ruby - 太阳黑子:按属性对刻面结果进行排序/排序,例如创建时间

ruby - RegEx删除换行符并替换为逗号

c# - 为什么在从字典中读取时锁定

ruby - JRuby 垃圾收集在 Rails 中运行单元和功能测试时抛出错误

java - 将 Java 代码转换为 JRuby