Thread View: pl.comp.lang.ruby
6 messages
6 total messages
Started by Medyk
Wed, 21 Feb 2007 20:39
Timeout
Author: Medyk
Date: Wed, 21 Feb 2007 20:39
Date: Wed, 21 Feb 2007 20:39
43 lines
2462 bytes
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
Author: Marcin Mielżyński
Date: Wed, 21 Feb 2007 21:04
Date: Wed, 21 Feb 2007 21:04
20 lines
1260 bytes
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
Author: Medyk
Date: Wed, 21 Feb 2007 22:14
Date: Wed, 21 Feb 2007 22:14
41 lines
2053 bytes
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
Author: Marcin Mielżyński
Date: Wed, 21 Feb 2007 22:28
Date: Wed, 21 Feb 2007 22:28
21 lines
1400 bytes
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
Author: Medyk
Date: Thu, 22 Feb 2007 16:14
Date: Thu, 22 Feb 2007 16:14
31 lines
1877 bytes
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
Author: Marcin Mielżyński
Date: Thu, 22 Feb 2007 17:21
Date: Thu, 22 Feb 2007 17:21
25 lines
1685 bytes
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