ruby中的基本popen3语法

时间:2012-07-15 18:56:33

标签: ruby asynchronous popen

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

我想知道第二种语法是否导致某些线程被阻塞。我对异步代码很新,所以非常感谢任何见解!

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

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