2013-07-10 3 views
0

나는 테스트 프로그램을 썼다. 즉, 다음을 수행합니다 이 다중 스레드 프로그램이 의도 한대로 작동하지 않는 이유는 무엇입니까?

  • 6 개 스레드와 인쇄 실행 시간에 같은 프로그램을 실행

    1. 는 어떤 임의의 쓸모 calcuations를 실행합니다 (그러나 충분히 길게) 단일 스레드 및 인쇄 실행에 시간을

    이제 두 경우 모두 실행 시간이 동일합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?
    여기 소스 인 : 여러 스레드를 실행하는 동안 정말 평행하지 않은 루비와 파이썬 같은

    def time 
        start = Time.now 
        yield 
        p Time.now - start 
    end 
    
    
    range_limit = 9999 
    i_exponent = 9999 
    
    time do 
        array = (1 .. range_limit).map { |i | i**i_exponent } 
        p (array.inject(:+)/2)[0] 
    end 
    
    time do 
        first_thread = Thread.new do 
        arr = (1..range_limit/6).map { |i| i**i_exponent } 
        arr.inject(:+) 
        end 
    
        second_thread = Thread.new do 
        arr = (range_limit/6..range_limit*2/6).map { |i| i**i_exponent } 
        arr.inject(:+) 
        end 
    
        third_thread = Thread.new do 
        arr = (range_limit*2/6..range_limit*3/6).map { |i| i**i_exponent } 
        arr.inject(:+) 
        end 
    
        fourth_thread = Thread.new do 
        arr = (range_limit*3/6..range_limit*4/6).map { |i| i**i_exponent } 
        arr.inject(:+) 
        end 
    
        fifth_thread = Thread.new do 
        arr = (range_limit*4/6..range_limit*5/6).map { |i| i**i_exponent } 
        arr.inject(:+) 
        end 
    
        sixth_thread = Thread.new do 
        arr = (range_limit*5/6..range_limit).map { |i| i**i_exponent } 
        arr.inject(:+) 
        end 
    
        first_thread.join 
        second_thread.join 
        third_thread.join 
        fourth_thread.join 
        fifth_thread.join 
        sixth_thread.join 
    
        result = first_thread.value + second_thread.value + third_thread.value + fifth_thread.value + sixth_thread.value 
    
        p (result/2)[0] 
    end 
    
  • 답변

    1

    통역 - 통역의 상태를 보호하기 위해, 그들은 global VM lockdoesn't allow simultaneous execution 것이 있습니다.

    스레드의 이점을 얻으려면 스레드 대신 use multiple processes 전역 잠금없이 실행되는 비 루비 코드를 실행하는 방법을 찾아야합니다. 또 다른 옵션은 JRuby 나 Rubinius와 같은 전역 잠금이없는 루비 구현으로 전환하는 것입니다.

    +0

    와우. 그래서 나는 무엇을해야합니까? – konnigun

    +0

    @Chelios 여러 프로세스를 사용하십시오. 나는 이제 좀 더 쉽게하기 위해 몇 가지 모듈을 제공하는 SO 응답에 대한 링크로 답변을 업데이트했습니다. – user4815162342

    +0

    다른 Ruby 구현을 사용하는 것이 가능하면 문제를 해결할 수 있습니다. JRuby 나 Rubinius 모두 GIL이 없으며 코드를 병렬로 실행할 수 있습니다. –

    관련 문제