Jes*_*sky 11 ruby process shared-objects
我有一个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 因为分叉而显示为零.
那么分叉进程是否可以共享变量?如果是这样,怎么样?
ram*_*ion 13
一个问题是您需要使用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, {} ]
进行进程间通信的一种方法是使用pipe(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限制时,线程是否会让你获得任何收益.
| 归档时间: | 
 | 
| 查看次数: | 9387 次 | 
| 最近记录: |