【问题标题】:basic popen3 syntax in rubyruby 中的基本 popen3 语法
【发布时间】:2012-07-15 18:56:33
【问题描述】:

popen3的以下两种用法有什么区别吗?

html = ''
stdin, stdout, stderr = Open3.popen3("curl #{url}")
html << stdout.read

html = ''
Open3.popen3("curl #{url}") do |stdin, stdout, stderr, wait_thr|
  result << stdout.read
end

我想知道第二种语法是否会导致某些线程阻塞。我对异步代码相当陌生,因此非常感谢任何见解!

【问题讨论】:

    标签: ruby asynchronous popen


    【解决方案1】:

    在第一种形式中,您应该明确关闭 stdinstdoutstderr

    【讨论】:

    • 如果在循环中使用第一种语法,也许不关闭这些流会导致问题?
    • 我认为如果你在一个循环中打开许多流会有问题。我建议你把popen3相关的东西都挑出来,测试一下,然后注入到你的主项目中。
    • 好主意。不知道上面第二种形式的流在block之后是不是关闭了?
    • 是的,block 会自动关闭流。
    【解决方案2】:

    您遇到阻塞行为的原因是因为您没有关闭通过 popen3 打开的程序 (curl) 的标准输入 - 所以 curl 仍在等待您的输入。

    您应该在完成向程序发送数据后通过stdin.close 显式关闭标准输入,否则它将继续期待标准输入上的输入,popen3 将挂起。

     stdin.close    # always close your stdin after you are done sending commands/data
                    # or popen3 will appear to hang
    

    【讨论】:

      猜你喜欢
      • 2011-07-28
      • 2012-02-15
      • 2017-02-12
      • 1970-01-01
      • 2023-04-07
      • 2014-10-09
      • 2012-03-28
      • 1970-01-01
      相关资源
      最近更新 更多