Ruby多线程问题

时间:2012-08-01 00:19:54

标签: ruby multithreading

我开始研究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立即执行。在线程成功完成之前,我不希望显示任何输出。

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