🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.ruby
6 messages
6 total messages Started by Medyk Wed, 21 Feb 2007 20:39
Timeout
#447
Author: Medyk
Date: Wed, 21 Feb 2007 20:39
43 lines
2462 bytes
Mam problem z timeout'em
Jest skrypt, który jest wywoływany przez cron'a, który ma pobrać czy po 
prostu odpalić stronę www.
Przykładowo:

resp, data = Net::HTTP.new('www.jakis-tam.com').get('/')

Strona może się ładować i kilka minut (2-3 minuty)
Przeczytałem gdzieś, że aby uniknąć błędów timeout, należy kod wsadzić w 
  blok timeout. Przykładowo:

Timeout::timeout(600) {
	resp, data = Net::HTTP.new('www.jakis-tam.com').get('/')
}

Mimo wszystko po 3-4-ech minutach jest wywalany bład timeout, mimo iż 
wyraźnie zaznaczyłem by trzymał go maksymalnie 10 minut.
Informacja o błędzie:

/usr/local/lib/ruby/1.8/timeout.rb:54:in `rbuf_fill': execution expired 
(Timeout::Error)
	from /usr/local/lib/ruby/1.8/timeout.rb:56:in `timeout'
	from /usr/local/lib/ruby/1.8/timeout.rb:76:in `timeout'
	from /usr/local/lib/ruby/1.8/net/protocol.rb:132:in `rbuf_fill'
	from /usr/local/lib/ruby/1.8/net/protocol.rb:116:in `readuntil'
	from /usr/local/lib/ruby/1.8/net/protocol.rb:126:in `readline'
	from /usr/local/lib/ruby/1.8/net/http.rb:2017:in `read_status_line'
	from /usr/local/lib/ruby/1.8/net/http.rb:2006:in `read_new'
	from /usr/local/lib/ruby/1.8/net/http.rb:1047:in `request'
	from /usr/local/lib/ruby/1.8/net/http.rb:1034:in `request'
	from /usr/local/lib/ruby/1.8/net/http.rb:543:in `start'
	from /usr/local/lib/ruby/1.8/net/http.rb:1032:in `request'
	from /usr/local/lib/ruby/1.8/net/http.rb:769:in `get'
	from /etc/cron.daily/moj_skrypt.rb:2
	from /usr/local/lib/ruby/1.8/timeout.rb:56:in `timeout'
	from /etc/cron.daily/moj_skrypt.rb:1

Nie czuję się dobry w Ruby, tak naprawdę dopiero raczkuję, pewnie chodzi 
o coś oczywistego. Będę wdzięczny za jakiekolwiek sugestie.

-- 
Medyk
http://www.medikoo.com
Re: Timeout
#448
Author: Marcin Mielżyński
Date: Wed, 21 Feb 2007 21:04
20 lines
1260 bytes
Medyk wrote:
> Mam problem z timeout'em
> Jest skrypt, który jest wywoływany przez cron'a, który ma pobrać czy po 
> prostu odpalić stronę www.
> Przykładowo:
> 
> resp, data = Net::HTTP.new('www.jakis-tam.com').get('/')
> 

Musisz złapać fakt samego timeoutu:

begin
   timeout(600) do
      resp, data = Net::HTTP.new('www.jakis-tam.com').get('/')
   end
rescue TimeoutError
   # cokolwiek	
end

lopex
Re: Timeout
#449
Author: Medyk
Date: Wed, 21 Feb 2007 22:14
41 lines
2053 bytes
Marcin Mielżyński wrote:
> Medyk wrote:
>> Mam problem z timeout'em
>> Jest skrypt, który jest wywoływany przez cron'a, który ma pobrać czy 
>> po prostu odpalić stronę www.
>> Przykładowo:
>>
>> resp, data = Net::HTTP.new('www.jakis-tam.com').get('/')
>>
> 
> Musisz złapać fakt samego timeoutu:
> 
> begin
>   timeout(600) do
>      resp, data = Net::HTTP.new('www.jakis-tam.com').get('/')
>   end
> rescue TimeoutError
>   # cokolwiek   
> end
> 
> lopex

Co masz dokładnie na myśli?
Mi nie chodzi o wyłapanie tego błędu - tylko o to by dać taki timeout by 
strona się w pełni odpaliła, czyli by tego błędu nie było (innymi słowy 
by był, kiedy faktycznie czas ładowania jest niepokojący np. po 10 
minutach ale nie po 30 sekundach czy 2 minutach).
Jeśli domyślnie Ruby przerywa operację po 30 sekundach ja chcę by w tym 
przypadku przerwał ją po 10 minutach..
U mnie wygląda na to, że timeout się wywawala po 2-3 minutach, mimo 
następującego zapisu (który jak ja rozumiem, powinien pozwalać na 
odpalanie wewnętrznego bloku przez maksimum 10 minut):

Timeout::timeout(600) {
     resp, data = Net::HTTP.new('www.jakis-tam.com').get('/')
}


-- 
Medyk
http://www.medikoo.com/
Re: Timeout
#450
Author: Marcin Mielżyński
Date: Wed, 21 Feb 2007 22:28
21 lines
1400 bytes
Medyk wrote:

> 
> Co masz dokładnie na myśli?
> Mi nie chodzi o wyłapanie tego błędu - tylko o to by dać taki timeout by 
> strona się w pełni odpaliła, czyli by tego błędu nie było (innymi słowy 
> by był, kiedy faktycznie czas ładowania jest niepokojący np. po 10 
> minutach ale nie po 30 sekundach czy 2 minutach).

Eh, zmyliłeś mnie tym timeout - to wogóle nie do tego służy


require 'net/http'

h = Net::HTTP.new("www.onet.pl")
h.read_timeout = 600
puts h.get('/').body



lopex
Re: Timeout
#451
Author: Medyk
Date: Thu, 22 Feb 2007 16:14
31 lines
1877 bytes
Marcin Mielżyński wrote:
> Eh, zmyliłeś mnie tym timeout - to wogóle nie do tego służy
> 
> 
> require 'net/http'
> 
> h = Net::HTTP.new("www.onet.pl")
> h.read_timeout = 600
> puts h.get('/').body
> 

Dzięki! wygląda na to, że działa :)
Nie mniej nie bardzo rozumiem Twoje tłumaczenie, do czego jeśli nie do 
tego w takim razie służy ten blok:

Timeout::timeout(s) { }

Dokumentacja mówi:
Executes the method‘s block. If the block execution terminates before 
sec seconds has passed, it returns true. If not, it terminates the 
execution and raises exception (which defaults to Timeout::Error).

Co jak rozumiem powinno dawać to czego oczekiwałem, pozwolenie na 
wykonywanie się wewnętrznego kodu do czasu s.
Rozumiem, że błąd u mnie polegał na tym, że wsadzenie kodu w blok 
Timeout nie miało wpływu na wewnętrzny timeout obiektu Net::HTTP, który 
jedynie mogłem ustawić poprzez właściwość read_timeout. Dobrze rozumuję?

-- 
Medyk
http://www.medikoo.com/
Re: Timeout
#452
Author: Marcin Mielżyński
Date: Thu, 22 Feb 2007 17:21
25 lines
1685 bytes
Medyk wrote:

> Nie mniej nie bardzo rozumiem Twoje tłumaczenie, do czego jeśli nie do 
> tego w takim razie służy ten blok:

trochę zamieszałem, przyznaję się ;)

> Co jak rozumiem powinno dawać to czego oczekiwałem, pozwolenie na 
> wykonywanie się wewnętrznego kodu do czasu s.
> Rozumiem, że błąd u mnie polegał na tym, że wsadzenie kodu w blok 
> Timeout nie miało wpływu na wewnętrzny timeout obiektu Net::HTTP, który 
> jedynie mogłem ustawić poprzez właściwość read_timeout. Dobrze rozumuję?
> 

Tak, get robi to samo trochę niżej dla socketa, a jeszcze niżej w 
'protocol.rb':

     def rbuf_fill
       timeout(@read_timeout) {
         @rbuf << @io.sysread(1024)
       }
     end


lopex
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads