Совместно используемая переменная среди процессов Ruby

У меня есть программа 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 ноль дисплеев, хотя из-за ветвления.

Таким образом, действительно ли возможно иметь разветвленную долю процессов переменные? И если так, как?

11
задан Jesse Jashinsky 17 June 2010 в 15:32
поделиться

3 ответа

Одна проблема заключается в том, что вам нужно использовать 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 } ]

Однако я не уверен, принесет ли многопоточность вам какой-либо выигрыш, когда вы Привязка ввода-вывода.

13
ответ дан 3 December 2019 в 08:28
поделиться

Можно совместно использовать переменные между процессами; DRuby, вероятно, является самым низко барьерным способом сделать это.

0
ответ дан 3 December 2019 в 08:28
поделиться

Вы, вероятно, захотите использовать поток вместо форка, если хотите обмениваться данными.

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

О, и если вы действительно хотите воспользоваться преимуществами потоков, вам нужно использовать JRuby. В [c]Ruby 1.9 вы, возможно, захотите взглянуть на волокна. Хотя я их не рассматривал, и не знаю, подходит ли это решение для вас.

0
ответ дан 3 December 2019 в 08:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: