我正在尝试使用IO.pipe在进程之间发送消息,但在等待完成消息时遇到某种饥饿。
答案 0 :(得分:2)
我看到一个w_waiter.puts
和两个r_waiter.gets
,这就是它阻止的原因。如果我在第一个之后添加另一个w_waiter.puts
,它就会完成。这是问题吗?
编辑:我也在Ruby中试过这个
r_producer, w_producer = IO.pipe
r_waiter, w_waiter = IO.pipe
2.times do |i|
fork do
puts "in fork #{i}"
loop do
message = r_producer.gets.chomp
sleep 0.1
puts "#{message} from #{i}"
break if message == "0"
end
puts "sending finish"
w_waiter.puts "finish"
end
end
10.times do |i|
w_producer.puts i + 1
end
2.times do
w_producer.puts 0
end
2.times { r_waiter.gets }
puts "end of the program"
同样的结果。
我不确定为两个分叉进程使用相同的管道。您应该为每个进程创建一个管道。
或者(我不知道你的程序是什么),你可以使用spawn和channels,如并发指南中所述:http://crystal-lang.org/docs/guides/concurrency.html