Một vấn đề là bạn cần sử dụng Process.wait
để đợi cho quá trình chia đôi của bạn hoàn tất. Cái còn lại là bạn không thể thực hiện truyền thông interprocess thông qua các biến. Để xem điều này:
@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, {} ]
Một cách để thực hiện liên lạc liên thông là sử dụng đường ống (IO::pipe
). Mở nó trước khi bạn ngã ba, sau đó có mỗi bên của ngã ba đóng một đầu của đường ống.
Từ 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>
Nếu bạn muốn chia sẻ các biến, đề sử dụng:
@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 } ]
Tuy nhiên, tôi không chắc chắn nếu luồng sẽ giúp bạn có bất kỳ khoản lãi khi bạn đang IO bị ràng buộc.
Bạn có chắc là YAML đang dành thời gian không? Nếu vậy, bạn đã thử tải nó với Psych chứ không phải là Syck? –