Ruby进程间的共享变量

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

我有一个Ruby程序,它可以加载两个非常大的yaml文件,所以我可以通过分叉一些进程来利用多核来获得一些加速。我试过寻找,但我很难弄清楚如何,甚至是否可以在不同的过程中共享变量

以下代码是我目前拥有的代码:

@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 } ]