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
我想知道第二种语法是否导致某些线程被阻塞。我对异步代码很新,所以非常感谢任何见解!
答案 0 :(得分:1)
在第一种形式中,您应该明确关闭stdin
,stdout
和stderr
。
答案 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