Rubyで繰り返しプロセス間通信したい
require 'thread'
require 'time'
require 'find'
read, write = IO.pipe
# 子プロセス処理
fork do
testArray = Array.new
inArray = {
:id => 1000,
:type => "A"
}
testArray << inArray
testArray << inArray
# 子プロセスで読み出さないのでクローズ
read.close
loop do
str = Marshal.dump(testArray)
write.puts str
# write.close
sleep 5
end
write.close
end
# 親プロセス処理
# 親から書き込まないのでクローズ
write.close
Thread.new do
loop do
read.read
result = Marshal.load(message)
end
end
# プロセス処理終了待ち
Process.waitall
forkを勉強中です。
子プロセスから親プロセスにデータを渡したいと思っています。
親側でIO.pipeを作成し、子でシリアライズしたデータを親に繰り返し送ろうとしています。
繰り返し(loop do)処理がない場合、write.closeを子でおこなうことで
親側で値を取得できました。
繰り返し通知したい場合、「write.close」を行うと「write.puts」でエラーとなるため、
「write.close」をコメントアウトすると、「read.read」ができない状態となったため、
子プロセスの処理を
read.close
loop do
str = Marshal.dump(testArray)
write.puts str + 'end'★
sleep 5
end
親プロセス処理を
loop do
read.read
while message = read.gets('end')★
message.delete('end')★
results = Marshal.load(message)
end
end
このようにしたところ、
子からの書込み1回目は成功し、
二回目は、以下まではくるももの、 Marshal.load以降が処理されません。
message.delete('end')★
書込みや読み込みを繰り返し実施する場合、そもそもこのような作りではないのでしょうか?