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=.