我有一个从两个线程调用的对象的应用程序范围实例。
此对象包含一个存储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则不会发生这种情况。
答案 0 :(得分:2)
只有在Apache / Passenger中运行才会发生这种情况,而Webrick则不会发生这种情况。
Apache / Passenger启动多个工作进程,每个进程运行一个单独的应用程序实例,每个进程都有自己的@channels
数组。
Ruby对象不在进程之间共享,但还有其他选项可以像DRb,套接字,队列或键值存储一样进行通信。