Joel VanderWerf
11/6/2007 5:51:00 PM
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