[Moscow.pm] Ограничить время выполнения произвольной функции
Alex Kapranoff
kapranoff на gmail.com
Пт Янв 29 07:19:14 PST 2010
2010/1/29 Dmitry E. Oboukhov <unera на debian.org>
> On 15:39 Fri 29 Jan , Dmitry Karasik wrote:
> >> Вообще-то у goto задокументирована возможность выхода из сабов. А goto
> &sub
> >> -- это вообще не goto, поэтому с ним тут глюки :)
>
> DK> более того, из нормальных сабов он это и делает - сам пользуюсь ;)
> DK> а вот из обработчика сигнала - нет.
>
> Эмм, как это нет? я набросал модульчик и у меня делает нормально: из
> обработчика alarm обратно в функцию
>
> my @res;
> eval {
> local $SIG{ALRM} = sub {
> $alarmed = 1;
> goto FOO_DONE;
> };
> alarm $timeout;
>
> if ($wantarray) {
> @res = eval { $code->(@args) };
> } elsif (defined $wantarray) {
> $res[0] = eval { $code->(@args) };
> } else {
> eval { $code->(@args) };
> }
> alarm 0;
>
> die if $@;
> };
>
> FOO_DONE:
>
> и вот тут мы уже полностью вышли и из обработчика сигнала и из функции
> которую хотели прервать.
>
Он не переходит по метке, а просто умирает (и тем завершает внешний eval).
Поставьте say "FAIL" прямо ПЕРЕД меткой, и всё увидете :)
Тяжело тестить такую базовую вещь на модуле. Посмотрите выше по треду
однострочники Монса и как они не работают.
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20100129/17f446e2/attachment.html>
Подробная информация о списке рассылки Moscow-pm