在Rails / Apache / Passenger中运行时具有不同内容的相同数组

时间:2014-08-27 08:06:27

标签: ruby-on-rails apache passenger

我有一个从两个线程调用的对象的应用程序范围实例。

此对象包含一个存储EventMachine::Channel个对象的数组。

require 'em-websocket'

class A
  def self.instance
    @inst ||= self.new
  end

  def initialize
    @channels = []
    puts "init: self=#{self.inspect}\nchannels=#{@channels.inspect}\n\n"
  end

  def add
    @channels << EventMachine::Channel.new
    puts "add: self=#{self.inspect}\nchannels=#{@channels.inspect}\n\n"
  end

  def use
    puts "use: self=#{self.inspect}\nchannels=#{@channels.inspect}\n\n"
  end
end

当涉及到使用这个数组时,事实证明当从Rails控制器的动作调用时,从附加线程调用的数组包含一个通道而没有通道。

self@channels.object_id在两种情况下都相同,只有@channels.length不同。只有在Apache / Passenger中运行才会发生这种情况,而Webrick则不会发生这种情况。

1 个答案:

答案 0 :(得分:2)

  

只有在Apache / Passenger中运行才会发生这种情况,而Webrick则不会发生这种情况。

Apache / Passenger启动多个工作进程,每个进程运行一个单独的应用程序实例,每个进程都有自己的@channels数组。

Ruby对象不在进程之间共享,但还有其他选项可以像DRb,套接字,队列或键值存储一样进行通信。