2013-07-10 32 views
0

我寫了一個測試程序。總之,它執行以下操作:爲什麼按預期這種多線程程序無法正常工作?

  1. 執行一些隨機無用calcuations(但足夠長)在單個線程和打印執行 時間
  2. 在6成一線並打印執行時間執行相同的程序

現在,在這兩種情況下執行時間都是一樣的。我究竟做錯了什麼?
這裏有來源:

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

口譯像Ruby和Python,同時執行多個線程不是真正的並行 - 保護解釋的狀態,他們有一個global VM lockdoesn't allow simultaneous execution

要獲得線程的好處,你需要找到一種方法來執行,如果沒有全局鎖運行非Ruby代碼,use multiple processes,而不是線程。另一種選擇是切換到沒有全局鎖定的ruby實現,例如JRuby或Rubinius。

+0

哇。那我該怎麼辦? – konnigun

+0

@Chelios使用多個進程。我現在已經更新了答案,提供了一個SO答案的鏈接,該鏈接提供了一些模塊以簡化操作。 – user4815162342

+0

如果它是可行的,使用不同的Ruby實現,能夠解決您的問題。 JRuby和Rubinius都沒有GIL,並允許代碼並行執行。 –

相關問題