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

Niatruc · 2018年06月24日 · 最后由 Niatruc 回复于 2018年06月24日 · 1572 次阅读

我在一个 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 是干什么的?

googya 回复

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

发现解决方法:i.flush

Niatruc 回复

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

需要 登录 后方可回复, 如果你还没有账号请 注册新账号