【问题标题】:Finding current Thread Id with JRuby on Rails使用 JRuby on Rails 查找当前线程 ID
【发布时间】:2013-09-30 18:57:24
【问题描述】:
我在启用线程模式 (config.threadsafe!) 的 JRuby 1.7 上使用带有 Puma 的 Rails3。
现在按照理论:对于进来的多个客户端请求,将使用一个新线程来为用户提供服务,而不是每次都启动一个新的 Rails 进程。
如果我想找到这个新请求线程的id,我该怎么做?
【问题讨论】:
标签:
ruby-on-rails
ruby-on-rails-3
multithreading
jruby
jrubyonrails
【解决方案1】:
...查找当前正在执行的Thread ruby-way 的“唯一”线程 id:
Thread.current.object_id
这将适用于所有红宝石,但它可能不是真正“独特的”......看到一些服务器(并且 puma 也可能这样做)可能会重新使用“本机”线程(例如使用固定线程池)因此对于一个接一个地执行的 2 个请求,ID 可能实际上是相同的。
根据实现细节,它可能是一个不同的 ruby Thread(虽然不太可能)对象,但在 JRuby 下将是相同的 Java 线程......您可以使用以下方法获得“本机”java.lang.Threadid:
JRuby.reference(Thread.current).native_thread.id
一般来说,如果您需要每个请求真正独特的东西,您应该基于例如(Rack/Rails) Request 对象本身不被应用程序/服务器重用(回收)。
【解决方案2】:
为此,您会发现以下方法很有用:
Thread.current 获取当前正在执行的线程
#<Thread:0x8301ef4 run>
Thread.list 为所有可运行或已停止的线程获取 Thread 对象数组。
[
[0] #<Thread:0x8301ef4 run>
]
希望对你有帮助