[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

ruby thread newbie problem

Bram Kuijper

11/6/2007 3:55:00 PM

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?


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

# output Thread number
puts "executing #{contents_of_queue} " + "by thread #{this_thread_name}"

end
end
end

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
2 Answers

Joel VanderWerf

11/6/2007 5:51:00 PM

0

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

Justin Collins

11/6/2007 6:47:00 PM

0

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?
>
>
> 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
>
> # output Thread number
> puts "executing #{contents_of_queue} " > + "by thread #{this_thread_name}"
>
> end
> end
> end
>
> 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

Thread 1 isn't showing up because Thread 0 empties the queue before
Thread 1 even gets to run.
Before

while ! queue.empty?

add

puts "This is thread #{this_thread_name}"

and you'll see that they do both run, it's just the second thread
doesn't need to do anything.

-Justin