我开始研究Ruby中的多线程。
基本上,我想创建一些线程,让它们全部执行,但是在线程成功完成之前不显示任何输出。
示例:
#!/usr/bin/env ruby
t1 = Thread.new {
puts "Hello_1"
sleep(5)
puts "Hello_1 after 5 seconds of sleep"
}
t2 = Thread.new {
puts "Hello_2"
sleep(5)
puts "Hello_2 after 5 seconds of sleep"
}
t1.join
t2.join
puts "Hello_3"
sleep(5)
puts "Hello_3 after 5 seconds of sleep"
第一个Hello_1 / Hello_2立即执行。在线程成功完成之前,我不希望显示任何输出。
答案 0 :(得分:6)
因为将print打印到单个输出流(sysout),如果要捕获每个线程的输出,则无法使用它。
您必须为每个线程使用单独的缓冲流,在每个线程中写入,然后在线程终止时将它们转储到sysout以查看输出。
以下是一个帖子的例子:
t = Thread.new() do
io = StringIO.new
io << "mary"
io.puts "fred"
io.puts "fred"
puts io.string
end
您必须将io传递给线程中的每个方法。
或查看this以创建重定向线程的stdout的模块。
但是在你开始用你的代码包装的每个线程中:
Thread.start do
# capture the STDOUT by storing a StringIO in the thread space
Thread.current[:stdout] = StringIO.new
# Do your stuff.. print using puts
puts 'redirected to StringIO'
# print everything before we exit
STDIO.puts Thread.current[:stdout].string
end.join
答案 1 :(得分:0)
您可以共享缓冲区,但应该“同步”对它的访问权限:
buffer = ""
lock = Mutex.new
t1 = Thread.new {
lock.synchronize{buffer << "Hello_1\n"}
sleep(5)
lock.synchronize{buffer << "Hello_1 after 5 seconds of sleep\n"}
}
t2 = Thread.new {
lock.synchronize{buffer << "Hello_2\n"}
sleep(5)
lock.synchronize{buffer << "Hello_2 after 5 seconds of sleep\n"}
}
t1.join
t2.join
puts buffer