Timeouts with Thread#join and Net:HTTP

Discussion in 'Ruby' started by Rushi, Mar 18, 2009.

  1. Rushi

    Rushi Guest

    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
     
    Rushi, Mar 18, 2009
    #1
    1. Advertisements

  2. Rushi

    Mike B Guest

    There is a reference to a timeout tool called terminator that you
    might look at in James Edward Gray 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.
     
    Mike B, Mar 19, 2009
    #2
    1. Advertisements

  3. Rushi

    7stud -- Guest

    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
     
    7stud --, Mar 20, 2009
    #3
    1. Advertisements

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.