From: Robert Klemme Date: 2009-05-28T01:11:42+09:00 Subject: Re: Newbie on Threads 2009/5/27 Nabs Kahn : > This is what I ended up doing, similar to what was suggested. > (definition of screenScrape method not included) Thanks for the update! > bufferSize = 10 > buffer = SizedQueue.new(bufferSize) > threads = [] > > producer = Thread.new do >  File.open("urls.txt").each do |url| >    buffer.enq url >  end >  bufferSize.times {buffer.enq(:END_OF_WORK)} > end > > bufferSize.times do >  threads << Thread.new do >    url = nil >    while(url != :END_OF_WORK) >      url = buffer.deq >      screenScrape(url) >    end >  end > end The loop above does not work properly because you will hand off :END_OF_WORK to screenScrape(). Rather do threads << Thread.new do while ((url = buffer.deq) != :END_OF_WORK) screenScrape(url) end end or threads << Thread.new do until ((url = buffer.deq) == :END_OF_WORK) screenScrape(url) end end > producer.join > threads.each do |thr| >  thr.join > end Btw, you do not need a separate producer thread. You can simply do that in the main thread. But of course you must start worker threads before you start to fill the queue. Kind regards robert -- remember.guy do |as, often| as.you_can - without end http://blog.rubybestpractices.com/