Kernel sleep залип

3 просмотра
Перейти к первому непрочитанному сообщению

Akim

не прочитано,
27 дек. 2009 г., 09:22:3627.12.2009
– RubyOnRails to russian
Есть скрипт с циклом:

while(size > 0) do
...
sleep 1
end

Проблема в том что функция sleep иногда "залипает".
Может залипнуть на 5 итерации, а может и на 3005.
Вот тут http://groups.google.com/group/ruby-talk-google/browse_thread/thread/b3033be4db82e75e
чуваки пишут что поскольку sleep использует системное время, а не
процессорные тики, то может и вобще не слипнуть или уснуть слишком
надолго, поскольку системное время не стабильно.

Подскадите друзья, так ли это, и можно ли это обойти?

Akim

не прочитано,
27 дек. 2009 г., 09:54:4327.12.2009
– RubyOnRails to russian
Вот такую фигню написал

begin
SystemTimer.timeout_after(2.seconds) { sleep 1 }
rescue Timeout::Error => e
puts "SLEEP: timeout"
end

помогло, но всем понятно что бред ))

Есть варианты? Кто-нибудь?

On Dec 27, 7:22 pm, Akim <gleb.rezvuk...@gmail.com> wrote:
> Есть скрипт с циклом:
>
> while(size > 0) do
>   ...
>   sleep 1
> end
>
> Проблема в том что функция sleep иногда "залипает".
> Может залипнуть на 5 итерации, а может и на 3005.

> Вот тутhttp://groups.google.com/group/ruby-talk-google/browse_thread/thread/...

Anton Ageev

не прочитано,
27 дек. 2009 г., 10:43:0327.12.2009
– ror...@googlegroups.com
А с какой целью делается sleep 1?

2009/12/27 Akim <gleb.re...@gmail.com>:

--
WBR, Anton

Akim

не прочитано,
27 дек. 2009 г., 10:58:2427.12.2009
– RubyOnRails to russian
Чтобы не обращаться к базе слишком часто.
Залипает 100% эта функция, это можно проверить простыми путсами, если
вы про это.
Причем я не вижу вобще никакой связи залипания с остальным кодом и
когда я приделал SystemTimer к слипу и стал видеть каждое залипание,
тоже не выявилось системы.

On Dec 27, 8:43 pm, Anton Ageev <ant...@gmail.com> wrote:
> А с какой целью делается sleep 1?
>

> 2009/12/27 Akim <gleb.rezvuk...@gmail.com>:


>
> > Есть скрипт с циклом:
>
> > while(size > 0) do
> >  ...
> >  sleep 1
> > end
>
> > Проблема в том что функция sleep иногда "залипает".
> > Может залипнуть на 5 итерации, а может и на 3005.

> > Вот тутhttp://groups.google.com/group/ruby-talk-google/browse_thread/thread/...

Max Lapshin

не прочитано,
27 дек. 2009 г., 11:20:1527.12.2009
– ror...@googlegroups.com
Во всех операционных системах не реального времени, таймеры
гарантируют только то, что
они не вызовутся раньше чем через сколько-то.

SystemTimer.timeout_after(2.seconds) { sleep 1 } точно так же имеет
право залипнуть часа на четыре,
это заявленная семантика данной функции.

Однако возвращаясь к реальным задачам: а что плохо, что залипло чуть
на подольше?

Akim

не прочитано,
27 дек. 2009 г., 11:45:4127.12.2009
– RubyOnRails to russian
Дак он когда залипает какбе ничего не делает, а мне нужно чтобы он
только 1 секунду ничего не делал.
Плюс может вобще не отлипнуть.
Конечно это плохо )

SystemTimer кстати не залип еще ни разу.
Я просто не ожиал глюки увидеть в такой функции как sleep.

Max Lapshin

не прочитано,
27 дек. 2009 г., 11:48:0827.12.2009
– ror...@googlegroups.com
2009/12/27 Akim <gleb.re...@gmail.com>:

> Дак он когда залипает какбе ничего не делает, а мне нужно чтобы он
> только 1 секунду ничего не делал.
> Плюс может вобще не отлипнуть.
> Конечно это плохо )
>
> SystemTimer кстати не залип еще ни разу.
> Я просто не ожиал глюки увидеть в такой функции как sleep.

Винда?

Akim

не прочитано,
27 дек. 2009 г., 12:30:2027.12.2009
– RubyOnRails to russian
Сначала это появилось у меня на snow os x, потом уже на серваке
centos.

On Dec 27, 9:48 pm, Max Lapshin <max.laps...@gmail.com> wrote:
> 2009/12/27 Akim <gleb.rezvuk...@gmail.com>:

Max Lapshin

не прочитано,
27 дек. 2009 г., 12:31:0127.12.2009
– ror...@googlegroups.com
2009/12/27 Akim <gleb.re...@gmail.com>:

> Сначала это появилось у меня на snow os x, потом уже на серваке
> centos.
>

И какое значит реальное время залипания?

Dmitriy Timokhin

не прочитано,
27 дек. 2009 г., 12:52:3727.12.2009
– ror...@googlegroups.com
Да запросто: sleep в руби разумеется переключает его страшненькие зелёные треды; если их больше одного, можно запросто нарваться на какой-нибудь баг.

Попробуйте взять более новую версию интерпретатора, или перейти на 1.9, там треды по-другому сделаны. Если это не вариант — попробуйте вместо sleep делать цикл с Kernel.select([],[],[], time_left), только именно цикл — он может выдавать ложные срабатывания. Если и это не поможет — попробуйте взять ruby-ffi и по какому-нибудь примеру ( http://blog.headius.com/2008/10/ffi-for-ruby-now-available.html например ) вытащить себе функцию usleep из libc. Если это не вариант или нужно, чтобы программа работала в много тредов, то, наверное, единственное что остаётся — это взять NeverBlock и делать SELECT SLEEP(1); в базе…
> --
> --
> Данное сообщение отправлено Вам, так как Вы являетесь подписчиком группы "RubyOnRails to russian" на группах Google.
> FAQ группы находится по адресу: http://ru.wikibooks.org/wiki/RubyFAQ
>
> Для того, чтобы отправить сообщение в эту группу, пошлите его по адресу
> ror...@googlegroups.com
> Чтобы отменить подписку на эту группу, отправьте сообщение по адресу: ror2ru-un...@googlegroups.com
> Дополнительные варианты находятся на странице группы http://groups.google.com/group/ror2ru?hl=ru

Ответить всем
Отправить сообщение автору
Переслать
0 новых сообщений