12

私は 2 つの非常に大きな yaml ファイルをロードする Ruby プログラムを持っているので、いくつかのプロセスをフォークして複数のコアを利用することで、速度を上げることができます。調べてみましたが、異なるプロセスで変数を共有する方法、または共有できるかどうかさえわかりません。

次のコードは、私が現在持っているものです。

@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.wait1 つの問題は、フォークされたプロセスが完了するのを待つためにを使用する必要があることです。もう 1 つは、変数を介したプロセス間通信ができないことです。これを見るには:

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

プロセス間通信を行う 1 つの方法は、パイプ ( 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 に答える