使用红宝石线程延迟

时间:2012-07-26 06:33:18

标签: ruby multithreading

我编写了一个ruby脚本,其中包含要下载的文件列表(~250)。由于顺序下载需要很长时间。我想在一个单独的线程中下载每个文件。即使我已经给出了20的延迟,看起来所有线程一次都在击中服务器。因此我收到502错误,没有下载任何文件。如何在不重载服务器的情况下并行下载所有文件。

#list of fiiles
files = []
threads = []  
files.each do |file|
   threads  << Thread.new(file){ | file |
     sleep(20)  
     #Download the file using either curb or Net::HTTP
     sleep(20)
}
end

threads.each(&:join)

3 个答案:

答案 0 :(得分:0)

你应该考虑在后台使用这个。

查看一些实际上不会阻挡并在后台执行操作的宝石 - 例如,DelayedJob。另外,查看一些railscast:

http://railscasts.com/episodes/128-starling-and-workling

http://railscasts.com/episodes/128-starling-and-workling

答案 1 :(得分:0)

创建一个从中创建新线程的线程池。这样,您将不会创建比池中提供的更多的内容,并避免崩溃应用程序/服务器。或者,看看SideKiq这是后台队列处理器的多线程替代方案,如DelayedJob和Resque。

答案 2 :(得分:-1)

threads.each {|thread| thread.join; sleep 1}