Ruby进程间的共享变量
我有一个Ruby程序,它可以加载两个非常大的yaml文件,所以我可以通过分叉一些进程来利用多核来获得一些加速。我试过寻找,但我很难弄清楚如何,甚至是否可以在不同的过程中共享变量 以下代码是我目前拥有的代码:Ruby进程间的共享变量,ruby,process,shared-objects,Ruby,Process,Shared Objects,我有一个Ruby程序,它可以加载两个非常大的yaml文件,所以我可以通过分叉一些进程来利用多核来获得一些加速。我试过寻找,但我很难弄清楚如何,甚至是否可以在不同的过程中共享变量 以下代码是我目前拥有的代码: @proteins = "" @decoyProteins = "" fork do @proteins = YAML.load_file(database) exit end fork do @decoyProteins = YAML.load_file(database
@proteins = ""
@decoyProteins = ""
fork do
@proteins = YAML.load_file(database)
exit
end
fork do
@decoyProteins = YAML.load_file(database)
exit
end
p @proteins["LVDK"]
p
由于叉子的原因,尽管显示为零
那么,有可能让分叉的进程共享变量吗?如果是这样,怎么做?一个问题是您需要使用
流程。等待等待分支流程完成。另一个是不能通过变量进行进程间通信。要了解这一点:
@one = nil
@two = nil
@hash = {}
pidA = fork do
sleep 1
@one = 1
@hash[:one] = 1
p [:one, @one, :hash, @hash] #=> [ :one, 1, :hash, { :one => 1 } ]
end
pidB = fork do
sleep 2
@two = 2
@hash[:two] = 2
p [:two, @two, :hash, @hash] #=> [ :two, 2, :hash, { :two => 2 } ]
end
Process.wait(pidB)
Process.wait(pidA)
p [:one, @one, :two, @two, :hash, @hash] #=> [ :one, nil, :two, nil, :hash, {} ]
进行进程间通信的一种方法是使用管道(IO::pipe
)。在叉之前打开它,然后让叉的每一边都合上管子的一端
从ri IO::pipe
:
rd, wr = IO.pipe
if fork
wr.close
puts "Parent got: <#{rd.read}>"
rd.close
Process.wait
else
rd.close
puts "Sending message to parent"
wr.write "Hi Dad"
wr.close
end
_produces:_
Sending message to parent
Parent got: <Hi Dad>
但是,我不确定当您被IO绑定时,线程是否会给您带来任何好处。可以在进程之间共享变量;DRuby可能是实现这一点的最低门槛。如果要共享数据,您可能希望使用线程而不是fork
哦,如果你真的想利用线程,你会想使用JRuby。在[c]Ruby 1.9中,您可能总是想看看光纤。不过我还没有看过它们,我不知道它是否适合您。用于进程间通信,允许您在分叉进程之间轻松发送数据。线程不是我想要的,因为它没有利用多核。实际上我已经试过线程了,但实际上速度较慢。doc:hash
符号在哪里,当你写p[:one,@one,:hash,@hash]#=>[:one,1,{:one=>1}]
时?我如何在运行Rails初始化器的进程和运行HTTP请求的进程之间共享数据?保罗:我不知道这些是怎么产生的。你可能想把它变成一个完整的问题。我很想尝试命名管道,但可能有一种更简单的方法。也许是DB?你确定是YAML花时间吗?如果是这样的话,你试过用Psych而不是Syck来加载它吗?
@one = nil
@two = nil
@hash = {}
threadA = Thread.fork do
sleep 1
@one = 1
@hash[:one] = 1
p [:one, @one, :hash, @hash] #=> [ :one, 1, :hash, { :one => 1 } ] # (usually)
end
threadB = Thread.fork do
sleep 2
@two = 2
@hash[:two] = 2
p [:two, @two, :hash, @hash] #=> [ :two, 2, :hash, { :one => 1, :two => 2 } ] # (usually)
end
threadA.join
threadB.join
p [:one, @one, :two, @two, :hash, @hash] #=> [ :one, 1, :two, 2, :hash, { :one => 1, :two => 2 } ]