我可以使用类变量与线程进行通信吗?

时间:2012-04-07 21:45:47

标签: ruby-on-rails ruby nginx thread-safety passenger

使用类变量与Rails中的线程进行通信是否为0K?

与使用队列相比,是否存在任何利弊?

我不确定这是否适用于任何环境,它适用于我的:Ruby Enterprise + Passenger + nginx + Rails 3

以下是一个例子:

# rails runner "ThreadJob.new.run"
class ThreadJob

  @@counter = 0

  def run
    producer = Thread.new do
      1.upto 10 do
        sleep 1
        @@counter+= 1
        puts "Producer: #{@@counter}"
      end
    end

    consumer = Thread.new do
      sleep 0.5
      1.upto 10 do
        sleep 1
        @@counter-= 1
        puts "Consumer: #{@@counter}"
      end
    end

    producer.join
    consumer.join

    puts @@counter # result should be 0
  end
end

我想知道如果我从另一个进程中修改@@ counter,这是否可行。

1 个答案:

答案 0 :(得分:3)

不,从您的示例中更新多个线程的类变量是不行的。

看一看为什么以及如何使用Mutex类解决这个问题的解释:

http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_threads.html