【发布时间】:2016-10-29 13:51:35
【问题描述】:
我正在尝试使用 IO.pipe 在进程之间发送消息,但在等待完成消息时遇到了某种饥饿。
【问题讨论】:
标签: crystal-lang
我正在尝试使用 IO.pipe 在进程之间发送消息,但在等待完成消息时遇到了某种饥饿。
【问题讨论】:
标签: crystal-lang
我看到一个 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"
同样的结果。
我不确定为两个分叉进程使用相同的管道是否有效。您应该为每个进程创建一个管道。
或者(我不知道您的程序是什么),您可以使用 spawn 和 channels,如并发指南中所述:http://crystal-lang.org/docs/guides/concurrency.html
【讨论】: