2012-01-07 145 views
2

我讀了一些地方,即紅寶石線程/光纖阻塞IO甚至1.9。這是真的嗎?它是什麼意思?如果我在多個線程上執行一些net/http的東西,那麼在給定時間只有一個線程在運行該請求?紅寶石線程塊?

感謝

回答

2

假設你正在使用CRuby,只有一個線程在同一時間運行。但是,這些請求將並行執行,因爲每個線程在其IO未完成時將被阻塞在其IO上。所以如果你這樣做:

require 'open-uri' 
threads = 10.times.map do 
    Thread.new do 
    open('http://example.com').read.length 
    end 
end 

threads.map &:join 
puts threads.map &:value 

它會比按順序做得快。

此外,您可以檢查線程完成時是否完成W/O阻塞。

例如:

require 'open-uri' 
thread = Thread.new do 
    sleep 10 
    open('http://example.com').read.length 
end 
puts 'still running' until thread.join(5) 
puts thread.value 

隨着CRuby,該線程不能在同一時間運行,但它們仍然是有用的。其他一些實現,如JRuby,具有真正的線程並且可以並行運行多個線程。

一些很好的參考:

1

所有線程同時運行,但IO將被阻塞,直到他們全部完成。

換句話說,線程並不能給你「背景」過程的能力。解釋器將在發送更多消息之前等待所有線程完成。

這很好,如果您考慮一下,因爲如果下一個進程使用線程正在修改/使用的數據,您不必擔心它們是否完整。

如果你想後臺進程結賬delayed_job