【问题标题】:Why does my code never reaches the end when waiting for pipe?为什么我的代码在等待管道时永远不会到达末尾?
【发布时间】:2016-10-29 13:51:35
【问题描述】:

我正在尝试使用 IO.pipe 在进程之间发送消息,但在等待完成消息时遇到了某种饥饿。

代码:https://carc.in/#/r/12ly

【问题讨论】:

    标签: crystal-lang


    【解决方案1】:

    我看到一个 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

    【讨论】:

    • 但是有2个进程正在运行,当循环结束时它们都应该调用w_waiter.puts,一个被卡住并且消息“发送完成”只显示1次。
    • 我刚刚在 Ruby 中尝试过这个,我得到了相同的结果:
    • 我用 Ruby 代码和简短的解释/猜测编辑了答案
    • 我的目标是在多个进程中使用管道而不是通道作为 IPC,什么应该是更好的方法? Unix 套接字?
    • 每个进程可以使用一个管道吗?
    猜你喜欢
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    相关资源
    最近更新 更多