2009-10-27 146 views
3

運行ruby腳本的多個實例會更高效嗎?或該單個腳本中的多個線程?線程還是多進程?

例如,一個紅寶石腳本來檢查給定域的所有鏈接正在工作。

你會運行這個腳本或多線程的多個實例嗎?

你如何創建多個線程?

回答

3

「效率」可能意味着很多事情。對於Ruby < 1.9,green threads意味着您不會像線程那樣獲得儘可能多的併發性,因此使用多個腳本實例將是從開始到結束最小化總實時性的最佳方式。

至於創建它們,這裏是T「並行」下載頁面he Pickaxe book例如:

require 'net/http' 


pages = %w(www.rubycentral.com 
      www.awl.com 
      www.pragmaticprogrammer.com 
      ) 


threads = [] 


for page in pages 
    threads << Thread.new(page) { |myPage| 


    h = Net::HTTP.new(myPage, 80) 
    puts "Fetching: #{myPage}" 
    resp, data = h.get('/', nil) 
    puts "Got #{myPage}: #{resp.message}" 
    } 
end 


threads.each { |aThread| aThread.join } 
+0

林不知道該threads.each是什麼進行到底。 – gpwu 2009-10-27 02:06:21

+0

它一直等到線程完成,所以(a)你可以安全地使用結果,(b)如果你有線程做重要的事情,你不想退出。 (他們在內核#出口處發出噗噗聲。) – DigitalRoss 2009-10-27 02:32:33

+0

即使使用YARV 1.9中的原生線程,您仍然會遇到全局解釋器鎖定,這意味着您所獲得的只是併發性,而沒有並行性。 線程和手動分離進程的另一種替代方法是使用'fork',如果你的系統支持的話。 – 2011-11-07 02:18:05