[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 было извлечено&hellip;
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20100129/17f446e2/attachment.html>


Подробная информация о списке рассылки Moscow-pm