Forum: Ruby Timeouts with Thread#join and Net:HTTP

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Rushi (Guest)
on 2009-03-18 09:15
(Received via mailing list)
I have a script doing some multi-threaded work. Every thread is a call
to an API making a simple post request. My problem is that the script
throws a Timeout:Error when i'm waiting for all my threads to join
<code>
/usr/lib/ruby/1.8/timeout.rb:60:in `rbuf_fill': execution expired
(Timeout::Error)
        from test.rb:35:in `join'
        from test.rb:35
        from test.rb:34:in `each'
        from test.rb:34
</code>

Here's my code - test.rb
<code>
amount = 60
@threads = []

1.upto(amount) { |i|
  @threads << Thread.new do
    puts "New Thread Created #{i}"

    # This thread makes 10 post requests
    1.upto(10) { |j|
      puts "Thread #{i} Try #{j}"
      # => DO post request using Net:HTTP
      Net::HTTP.start("localhost", "80") do |http|
          response = http.request_post("/test/mypost.php?get=value",
"a=b,c=d")
        end
    }

  end
}

# Join all the threads we have created
@threads.each{ |thr|
   thr.join  # Timeout:ERror thrown here after approx 1.5 mins
}
</code>

Wrapping my thread.join call around Timeout::timeout (http://www.ruby-
doc.org/stdlib/libdoc/timeout/rdoc/classes/Timeout.html) didn't help
either.

Any suggestions how to make it *not* timeout so that I can finish
making all the API calls? I've tried hard but haven't been able to
find a solution
Mike B (Guest)
on 2009-03-19 23:35
(Received via mailing list)
On Mar 17, 11:11 pm, Rushi <removed_email_address@domain.invalid> wrote:
> </code>
>     # This thread makes 10 post requests
>
> either.
>
> Any suggestions how to make it *not* timeout so that I can finish
> making all the API calls? I've tried hard but haven't been able to
> find a solution

There is a reference to a timeout tool called terminator that you
might look at in James Edward G. II confreaks presentation
'LittleBIGRuby'  It is a quick reference, but it might do what you
want.

Code is here: http://rubyforge.org/frs/?group_id=1024&release_id=26322

I believe Ara Howard wrote it.

Mike B.
7stud -. (Guest)
on 2009-03-20 02:18
Rushi wrote:
> # Join all the threads we have created
> @threads.each{ |thr|
>    thr.join  # Timeout:ERror thrown here after approx 1.5 mins
> }
> </code>
>
> Wrapping my thread.join call around Timeout::timeout (http://www.ruby-
> doc.org/stdlib/libdoc/timeout/rdoc/classes/Timeout.html) didn't help
> either.
>
> Any suggestions how to make it *not* timeout so that I can finish
> making all the API calls? I've tried hard but haven't been able to
> find a solution

I don't see how join can timeout at all the way you've called it.  join
should never timeout, unless you specify a limit:


------------------------------------------------------------ Thread#join
     thr.join          => thr
     thr.join(limit)   => thr
------------------------------------------------------------------------
     The calling thread will suspend execution and run _thr_. Does not
     return until _thr_ exits or until _limit_ seconds have passed. If
     the time limit expires, +nil+ will be returned, otherwise _thr_ is
     returned.
This topic is locked and can not be replied to.