From: Joel VanderWerf Date: 2007-11-07T02:50:40+09:00 Subject: Re: ruby thread newbie problem Bram Kuijper wrote: > Hi all, > > As a ruby newbie, I am trying to have two Threads process the > contents of one Queue. However, in my code only one Thread is processing > the contents of Queue, instead of both Threads. How can I make sure that > _both_ Threads process the Queue mentioned below? It just that you haven't given them much work to do, and Ruby's thread scheduler has decided that this amount of work isn't big enough to justify switching between threads (there's a tradeoff between having very fine grained thread switching and higher throughput). You can increase the workload (more on the queue), or you can force the threads to switch more often, by using Thread.pass (below). But it's probably better to let Ruby's thread scheduler do that for you. > This is my code: > > queue = Queue.new > queue << "$contents_of_queue" > queue << "$contents_of_queue" > queue << "$contents_of_queue" > > threads = [] > > 2.times do |thread_index| > threads[thread_index] = > Thread.new(thread_index) do | this_thread_name | > > # let each Thread work with things from the queue > while ! queue.empty? > > contents_of_queue = queue.deq # Add this line to let other threads run (this is # rarely necessary) Thread.pass > > # output Thread number > puts "executing #{contents_of_queue} " \ > + "by thread #{this_thread_name}" > > end > end > end # And don't forget this, or else the main thread will quit even # if the child threads are still working: threads.each {|t| t.join} > > This code will output: > "executing $contents_of_queue by thread 0" > "executing $contents_of_queue by thread 0" > "executing $contents_of_queue by thread 0" > > my question is: why will thread 1 never show up? > > thanks, > Bram -- vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407