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"]
Run Code Online (Sandbox Code Playgroud)
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, {} ]
Run Code Online (Sandbox Code Playgroud)
进行进程间通信的一种方法是使用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>
Run Code Online (Sandbox Code Playgroud)
如果要共享变量,请使用线程:
@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 } ]
Run Code Online (Sandbox Code Playgroud)
但是,我不确定当你受IO限制时,线程是否会让你获得任何收益.