我正在开发 RoR 应用程序,我需要创建一些应该与我的基础和控制器一起使用的后台服务。我有一个带有线程的类,它必须对队列做一些工作。所以我们有:
class ServerThread
def initialize(name)
@name = name
@queue = Queue.new
@thread = Thread.new do
while true
if @queue.empty?
Thread.stop
end
item = @queue.pop
log = `run #{item}`
save_log(log) #save into DB
end
end
end
def add_to_queue(item)
@queue << item
@thread.run
end
end
现在它就像这样工作。我只是在某个文件中创建全局变量:
$threads = SomeService.new
Server.all.each do |server| #servers from DB
$threads << ServerThread.new(server.name)
end
有时浏览器用户通过控制器将项目添加到队列中:
class ServerController < ApplicationController
def add_to_queue
$threads.get_thread_by_name(params['server']).add_to_queue(params['item'])
render :nothing => true
end
end
我有一些用户将项目添加到队列中,我需要监视我的应用程序上的所有线程。我需要在启动我的 rails 应用程序时创建这个 $threads,并且这个线程应该对所有浏览器用户都是通用的。现在我尝试使用 apache2 和乘客部署我的应用程序,所以这个全局变量不起作用!
没有全局变量怎么办?
RoR 3.2,红宝石 1.9.2