2012-08-01 3 views
3

저는 루비에서 멀티 쓰레딩을 연구하기 시작했습니다.루비 다중 쓰레딩 질문

기본적으로 몇 가지 스레드를 만들고 스레드를 모두 성공적으로 완료 할 때까지 출력하지 않습니다.

예 :

#!/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 즉시 실행한다. 스레드가 성공적으로 완료 될 때까지 출력을 표시하고 싶지 않습니다.

답변

6

puts는 단일 출력 스트림 (sysout)에 인쇄하므로 각 스레드의 출력을 캡처하려는 경우 사용할 수 없습니다.

각 스레드마다 별도의 버퍼링 된 스트림을 사용하고, 각 스레드에서 버퍼링 된 스트림을 작성한 다음 스레드가 출력을 보려면 종료 될 때 sysout으로 덤프해야합니다. 당신은 스레드의 모든 방법 IO 통과해야합니다

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

: 여기

스레드의 예입니다.

또는 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 
+0

당신이 간단한 예제를 제공 할 수 ? 나는 이것에 관해서 다른 어떤 것도 발견 할 수 없었다. – awojo

+0

완료! 이것은 훌륭하게 작동했습니다. – awojo

+1

링크 된 블로그 게시물은 더 이상 사용할 수 없습니다. 코드가 아직 남아 있습니까? 당신은 그것을 요점에 넣고 대답을 업데이트 할 수 있습니까? – Schneems

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 
+0

감사합니다! 내가 그릴의 예제를 더 좋아한다. 왜냐하면 내가 버퍼를 공유하지 않기 때문이다. 고마워. – awojo