(PERL) Вызвать оператор по таймеру и прервать его работу

Yevgen
Дата: 04.09.2006 18:59:29
Имеется такая проблема. В процессе работы скрипта выполняется вот такая команда:

($ok, %ack) = $self->command($p1, p2, %p3);

Неважно почему, но метод данного объекта зацикливается и блокирует далее работу всего скрипта. Возможно ли стандартными средствами Perl выполнить эту строку таким образом, чтобы при не выходе из метода command по истечении определенного метода работа этого метода прерывалась? Важным условием является то, что модифицировать метод command не представляется возможным. Что можно сделать в таком случае?

Заранее спасибо!
g613
Дата: 04.09.2006 23:51:40
Yevgen
Имеется такая проблема. В процессе работы скрипта выполняется вот такая команда:

($ok, %ack) = $self->command($p1, p2, %p3);

Неважно почему, но метод данного объекта зацикливается и блокирует далее работу всего скрипта. Возможно ли стандартными средствами Perl выполнить эту строку таким образом, чтобы при не выходе из метода command по истечении определенного метода работа этого метода прерывалась? Важным условием является то, что модифицировать метод command не представляется возможным. Что можно сделать в таком случае?


eval {
  local $SIG{ALRM} = sub { die "timeout\n" };
  alarm $time_out; 
 ($ok, %ack) = $self->command($p1, p2, %p3);
  alarm 0;
}
if ( $@ =~ /^timeout/ ) {
   print "timeout\n"
} elsif ( length $@ ) {
  print "any error\n"
}

...под виндой alarm, если я правильно ошибаюсь, не работает... Если внутри чтение из сокетов\файлов то лудше воспользоваться select'ом, тот который с 4 параметрами...
Anjey aka PM
Дата: 05.09.2006 01:00:21
RTFM iThread (не очень оптимальный варинат, но все же) или опять-таки RTFM fork
g613
Дата: 05.09.2006 10:15:46
Anjey aka PM
RTFM iThread (не очень оптимальный варинат, но все же) или опять-таки RTFM fork


а как новый процес и нить повлияет на таймауты ?
Anjey aka PM
Дата: 06.09.2006 11:17:11
Yevgen
...метод данного объекта зацикливается и блокирует далее работу всего скрипта...


Человек изначально не сказал что ему нужны ТОЛЬКО таймауты. Отсюда я предположил что возможно паралельная обработка его также интересует...

В любом случае порожденный процесс или поток можно убить через определенное время
Yevgen
Дата: 06.09.2006 18:33:44
Anjey aka PM
Yevgen
...метод данного объекта зацикливается и блокирует далее работу всего скрипта...


Человек изначально не сказал что ему нужны ТОЛЬКО таймауты. Отсюда я предположил что возможно паралельная обработка его также интересует...

В любом случае порожденный процесс или поток можно убить через определенное время


Подскажите, как можно, используя перловый threads, создав его однажды, потом прибить из другого thread'а, т.е. из того, в котором он был создан?
Black
Дата: 06.09.2006 19:03:20
kill()
Yevgen
Дата: 07.09.2006 01:19:18
Николай aka Motodor
kill()


А в качестве параметра передавать tid thread'а? Или как это будет выглядеть?
Yevgen
Дата: 07.09.2006 11:57:48
Anjey aka PM
учитесь сами искать ответы на свои вопросы


Перед тем, как спросить, я пересмотрел кучу документации. Эта ссылочка, что вы указали, для меня не нова. Но главное - она не отвечает на мой вопрос. Там НЕТ НИ СЛОВА о том, как уничтожить thread. Но там указывается, что можно получить tid thread'а. Вот я и спросил, можно ли передать kill'у этот tid.