我正在尝试使用IO。管道在进程之间发送消息,但是当我在等待完成消息时,我遇到了某种饥饿。
代码:https://carc.in//r/12 ly
我看到一个w_waiter.puts
和2倍的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"
相同的结果。
我不确定为两个分叉进程使用相同的管道是否有效。您应该为每个进程创建一个管道。
或者(我不知道您的程序是什么),您可以使用衍生和通道,如并发指南中所述:http://crystal-lang.org/docs/guides/concurrency.html