使用Rails在多个httpd线程之间共享变量的方法?

时间:2011-03-09 16:42:54

标签: ruby-on-rails ruby multithreading shared-memory

假设我的Rails Web应用程序中有以下线程:

class MyController
  def my_action
    count = 0
    arr = []

    10.times do |i|
      arr[i] = Thread.new {
        sleep(rand(0)/10.0)
        Thread.current["mycount"] = count
        count += 1
      }
    end

    arr.each {|t| t.join; print t["mycount"], ", " }
    puts "count = #{count}"
  end
end

如您所见,'count'变量在所有线程中共享。

现在,我想要做的是在多个httpd请求中分享'count',并且允许myController中的my_action有权访问该变量。例如,也许产生ruby进程以服务httpd进程的任何东西都可以在其范围内保存变量count,然后为httpd进程生成的ruby进程可以访问该变量。

使用memcached,数据库和会话变量是不可能的。最终'count'实际上是一个资源对象......一个FTP连接。

这可能吗?也许使用像this这样的Apache / Passenger工作者?

示例代码将不胜感激。

1 个答案:

答案 0 :(得分:1)

使用全局变量确实可以做到这一点。 Rails中的全局变量是以美元符号开头的变量,如$ count。