[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

Re: Actors and Concurrency

Leonard Cuff

2/13/2008 7:29:00 PM

I'm a newbie, so please set me straight. I've seen several people make the
statement that 'Ruby does not have concurrency'. If this is so, what is the
Threads class all about? And what is happening in this piece of code...Is
this somehow the appearance of concurrency without being 'real' concurrency?
What are the limitations here?

Thanks!

Leonard


#!/usr/bin/env ruby

# Fetch three urls simultaneously

require 'net/http'

pages = %w( www.rubycentral.com
www.google.com
www.pragprog.com
)

threads = []

for page in pages
threads << Thread.new(page) { |myPage|


h = Net::HTTP.new(myPage, 80)
puts "Fetching: #{myPage}"
resp, data = h.get('/', nil )
puts "Got #{myPage}: #{resp.message}"
}
end


threads.each { |aThread| aThread.join }


Fetching: www.rubycentral.com
Fetching: www.google.com
Fetching: www.pragprog.com
Got www.google.com: OK
Got www.pragprog.com: OK
Got www.rubycentral.com: OK



On 2/11/08 4:00 PM, "Jason Roelofs" <jameskilton@gmail.com> wrote:

> (others can get more specific here, but here's the general idea)
>
> First of all, Ruby does not have concurrency. Not even 1.9 allows
> concurrently running threads. The Ruby VM is a preemptive kernel.
> Eventually Ruby's threads will be system threads *and* fully
> concurrent, but that's a long time from now.
>
> Second, Actors aren't really threads or Fibers. There's a single
> "dispatcher" thread/process/whatever that handles sending out events
> to the pool of actors. So while Actors may look like threads and
> concurrency, they aren't.
>
> So put the two together, and you're going to get sequential code execution.
>
> Jason
>
> On Feb 11, 2008 6:18 PM, fedzor <fedzor@gmail.com> wrote:
>> So I was messing with actors today, and I found that I couldn't get
>> an actor to run concurrently with the main thread. Am I just wishing
>> fibers are something they're not?
>>
>> I had:
>>
>> Actor.spawn
>> sleep 1
>> puts 5
>> end
>>
>> puts 6
>>
>> and it went:
>> 5
>> 6
>>
>> So what do I have to do to get Actors to go concurrent on my ass? I
>> was hoping for:
>> 6
>> 5
>>
>> Thanks,
>> Ari
>> --------------------------------------------|
>> If you're not living on the edge,
>> then you're just wasting space.
>>
>>
>>
>>
>


2 Answers

Jason Roelofs

2/13/2008 7:41:00 PM

0

Yeah, sorry, it can be confusing.

Ruby has threads, and they do run separate execution paths. However,
these threads do not run *at the same time*. The Ruby 1.8 VM is a
preemptive scheduler, in that it gives Thread 1 x milliseconds of
execution time, then Thread 2, then Thread 3, looping back to Thread
1. So in the end it looks as if they are running simultaneously, but
they in fact are not.

This is actually the same in Ruby 1.9, except instead of Green threads
(built, managed, and controlled exclusively by Ruby), it uses System
threads (pthreads), but it still controls the thread execution to be
the same as 1.8 Green threads.

I hope I explained that clearly enough. Please say if you're still confused.

Jason

On Feb 13, 2008 2:28 PM, Leonard Cuff <lcuff@valueclick.com> wrote:
> I'm a newbie, so please set me straight. I've seen several people make the
> statement that 'Ruby does not have concurrency'. If this is so, what is the
> Threads class all about? And what is happening in this piece of code...Is
> this somehow the appearance of concurrency without being 'real' concurrency?
> What are the limitations here?
>
> Thanks!
>
> Leonard
>
>
> #!/usr/bin/env ruby
>
> # Fetch three urls simultaneously
>
> require 'net/http'
>
> pages = %w( www.rubycentral.com
> www.google.com
> www.pragprog.com
> )
>
> threads = []
>
> for page in pages
> threads << Thread.new(page) { |myPage|
>
>
> h = Net::HTTP.new(myPage, 80)
> puts "Fetching: #{myPage}"
> resp, data = h.get('/', nil )
> puts "Got #{myPage}: #{resp.message}"
> }
> end
>
>
> threads.each { |aThread| aThread.join }
>
>
> Fetching: www.rubycentral.com
> Fetching: www.google.com
> Fetching: www.pragprog.com
> Got www.google.com: OK
> Got www.pragprog.com: OK
> Got www.rubycentral.com: OK
>
>
>
>
> On 2/11/08 4:00 PM, "Jason Roelofs" <jameskilton@gmail.com> wrote:
>
> > (others can get more specific here, but here's the general idea)
> >
> > First of all, Ruby does not have concurrency. Not even 1.9 allows
> > concurrently running threads. The Ruby VM is a preemptive kernel.
> > Eventually Ruby's threads will be system threads *and* fully
> > concurrent, but that's a long time from now.
> >
> > Second, Actors aren't really threads or Fibers. There's a single
> > "dispatcher" thread/process/whatever that handles sending out events
> > to the pool of actors. So while Actors may look like threads and
> > concurrency, they aren't.
> >
> > So put the two together, and you're going to get sequential code execution.
> >
> > Jason
> >
> > On Feb 11, 2008 6:18 PM, fedzor <fedzor@gmail.com> wrote:
> >> So I was messing with actors today, and I found that I couldn't get
> >> an actor to run concurrently with the main thread. Am I just wishing
> >> fibers are something they're not?
> >>
> >> I had:
> >>
> >> Actor.spawn
> >> sleep 1
> >> puts 5
> >> end
> >>
> >> puts 6
> >>
> >> and it went:
> >> 5
> >> 6
> >>
> >> So what do I have to do to get Actors to go concurrent on my ass? I
> >> was hoping for:
> >> 6
> >> 5
> >>
> >> Thanks,
> >> Ari
> >> --------------------------------------------|
> >> If you're not living on the edge,
> >> then you're just wasting space.
> >>
> >>
> >>
> >>
> >
>
>
>

MenTaLguY

2/13/2008 7:42:00 PM

0

On Thu, 14 Feb 2008 04:28:33 +0900, Leonard Cuff <lcuff@valueclick.com> wrote:
> I'm a newbie, so please set me straight. I've seen several people make the
> statement that 'Ruby does not have concurrency'. If this is so, what is
> the Threads class all about? And what is happening in this piece of code...Is
> this somehow the appearance of concurrency without being 'real'
> concurrency?

Unfortunately, people are confusing concurrency with simultaneity. Most
Ruby implementations (JRuby is an exception) do not permit Ruby threads
to run truly simultaneously (e.g. on multiple processors); instead,
their execution is simply interleaved in a non-deterministic fashion.

However, this is still concurrency in the technical sense of the term.

-mental