On Nov 18, 12:32 pm, Conrad Taylor <[email protected]> wrote:
> On Tue, Nov 17, 2009 at 1:07 PM, jhaagmans <[email protected]> wrote:
>
> > Hi,
>
> > I have a backgroundrb worker that gets triggered every second. When
> > it's triggered, it's supposed to make 2 - 15 http-requests using
> > Net::HTTP. My idea was to put every execution into a thread so the
> > next execution doesn't have to wait for the last one. So basically:
>
> > def http_requests
> >  hosts.each do |host|
> >    Thread.new do
> >      begin
> >        client = Net::HTTP.start(host)
> >      rescue
> >        #store host as inactive
> >      ensure
> >        client.finish if client.active?
> >      end
> >    end
> >  end
> > end
>
> > Of course that's not all it does, but I hope you understand what I'm
> > trying to do here.
>
> > The thing is: this doesn't get done once a second. It appears that
> > every HTTP-request is waiting for the last one to complete, which
> > clots up Rails very fast!
>
> > My question is: why is this? Does this have anything to do with Ruby
> > not being threadsafe (I doubt it, because that just means threads
> > aren't executed as precisely as with jRuby, right?) or is Net::HTTP
> > not able to make requests while another Net::HTTP request is still
> > running? And what to do?
>
> > I hope you can help.
>
> The Global Interpreter Lock (GIL) prevents threads from executing in
> parallel when using Ruby 1.8.6 aka MRI, 1.8.7, and 1.9.1 aka YARV.
> However, JRuby 1.3.x/1.4.x, MacRuby 0.5 Beta 2, Maglev and several
> other upcoming Ruby VMs are not constrained by the GIL.  Thus, they
> can execute threads in parallel.
>
> Good luck,
>
> -Conrad
>

Emm just because the threads aren't all executing *simultaneously*
doesn't that they aren't running in parallel (due to all the thread
switching etc).

Regardless, I can't seem to reproduce the OPs behviour:

require 'net/http'

def hosts
  %w[rubyforge.org www.scala-lang.org www.google.com www.gamefaqs.com
allrecipes.com m2k2.taigaforum.com youtube.com gitorious.org
everything2.com]
end

def http_requests
  hosts.each do |host|
    Thread.new do
      begin
        puts "fetching host #{host}"
        client = Net::HTTP.start(host)
      rescue e
        #store host as inactive
      ensure
        puts "finished with host #{host}"
        client.finish if client.active?
      end
    end
  end
end

irb(main):001:0> http_requests
fetching host rubyforge.orgfetching host www.scala-lang.orgfetching
host www.google.com
fetching host www.gamefaqs.com
fetching host allrecipes.com
fetching host m2k2.taigaforum.com
finished with host rubyforge.orgfetching host youtube.com
fetching host gitorious.org
finished with host www.google.com
fetching host everything2.com
=> ["rubyforge.org", "www.scala-lang.org", "www.google.com",
"www.gamefaqs.com", "allrecipes.com", "m2k2.taigaforum.com",
"youtube.com", "gitorious.org", "everything2.com"]
irb(main):002:0>

finished with host www.scala-lang.org
finished with host m2k2.taigaforum.comfinished with host www.gamefaqs.com
finished with host allrecipes.com


finished with host youtube.com
finished with host everything2.com
finished with host gitorious.org

Am I missing something or misunderstanding the question?

--

You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=.


Reply via email to