12

我有一个 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由于分叉,显示 nil。

那么有可能让分叉的进程共享变量吗?如果是这样,怎么办?

4

4 回答 4

15

一个问题是您需要使用Process.wait来等待您的分叉进程完成。另一个是你不能通过变量进行进程间通信。要看到这个:

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

如果要共享变量,请使用线程:

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

但是,我不确定当您受到 IO 限制时,线程是否会给您带来任何好处。

于 2010-06-16T21:18:54.710 回答
1

Cod用于进程间通信,允许您轻松地在分叉进程之间发送数据。

于 2014-10-01T13:07:42.733 回答
0

可以在进程之间共享变量;DRuby 可能是实现它的最低门槛的方法。

于 2010-06-16T21:22:01.693 回答
0

如果您想共享数据,您可能想使用线程而不是分叉。

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

哦,如果你真的想利用线程,你会想使用 JRuby。在 [c]Ruby 1.9 中,您可能总是想看看纤维。我还没有看过它们,我不知道这是否适合你。

于 2010-06-16T21:24:03.623 回答