Ruby 关于 Open3.popen3 方法的使用问题的请教

Niatruc · June 24, 2018 · Last by Niatruc replied at June 24, 2018 · 1555 hits

我在一个 ruby 程序中使用 Open3.popen3 这个方法打开另一个 ruby 程序 t1,并通过 io 流向另一个程序 t2 传递数据,而另一个程序使用 gets 方法来获取这些数据,如下:

# t1.rb
require "open3"

i, o, e, thr = Open3.popen3("jruby D:\\jruby-9.1.12.0\\test\\emtest\\t2.rb")

# 通过i传数据给子进程
i.puts "asdf"
puts '主进程'

Thread.new do
    o.each {|l|
        puts "从子进程来的数据:#{l}" 
    }
end

puts "end1"
thr.join
puts "end2"
# t2.rb
STDOUT.puts "123"
r = STDIN.gets
STDOUT.puts "rrr#{r}"

然后我在控制台窗口运行程序 t1,之后就这样一直卡着:

似乎程序 t2 中的 gets 方法并被没有取到数据而把程序阻塞了😂 请问各位大佬,这种情况要怎么办,是哪里的代码写错了?😂

join 是干什么的?

Reply to googya

让 thr 先执行完,阻塞其他线程

发现解决方法:i.flush

Reply to Niatruc

也就是在 i.puts 传入数据后,调用 i.flush

You need to Sign in before reply, if you don't have an account, please Sign up first.