2009-10-27 137 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