3

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 はすぐに実行されます。スレッドが正常に完了するまで、出力を表示したくありません。

4

2 に答える 2

6

出力を単一の出力ストリーム (sysout) に出力するため、スレッドごとに出力をキャプチャする場合は使用できません。

スレッドごとに個別のバッファリングされたストリームを使用し、各スレッドでそれに書き込み、スレッドが終了して出力を確認するときにそれらを sysout にダンプする必要があります。

スレッドの例を次に示します。

t = Thread.new() do
  io = StringIO.new
  io << "mary"
  io.puts "fred"
  io.puts "fred"
  puts io.string
end

スレッド内のすべてのメソッドに io を渡す必要があります。

または、スレッドの 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
于 2012-08-01T00:24:57.587 に答える
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
于 2012-08-01T01:21:24.047 に答える