gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:11:06 25 4
gpt4 key购买 nike

我正在尝试创建一个统计计数器(类似于 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com