[Moscow.pm] Ограничить время выполнения произвольной функции

Alex Kapranoff kapranoff на gmail.com
Пт Янв 29 06:22:47 PST 2010


2010/1/29 Mons Anderson <mons на cpan.org>

> On Friday 29 January 2010 16:38:12 Dmitry E. Oboukhov wrote:
> > Хехе :) вот Ромка рядом сидит может подтвердить. мы с утра первое что
> > попробовали это goto :)
> >
> > реально goto заменит саму sub что в SIG{ALRM} на то что мы вызовем, а
> > там нам надо делать что? return или die.
> > стек в этой функции показывает на прерванный eval.
> >
> > ретурн - вернет в eval
> > die - будет пойман eval'ом
> >
> > а вернуть управление надо в вызвавшую нас функцию.
> > то есть goto "удаляет" упоминание о функции SIGALRM, то есть удаляет 1
> > вызов с вершины стека, а удалить надо еще несколько функций
>
> можно использовать "плохой" goto ;)
>
> perl -E 'sub foo { eval "sleep 10" } { local $SIG{ALRM} = sub { goto EXIT;
> };
> alarm 1; foo(); EXIT: alarm 0; say "exited" }'
>

Ну и не работает :)
В смысле выполнение прерывается, а goto не срабатывает и перехода на метку
не происходит. "exited" выводится, потому что say стоит после foo().

Если убрать eval из foo(), то (а в отсутствие die он не нужен), то
появляется сообщение о попытке перехода на несуществующую метку.

perl -E 'sub foo { sleep 10 } { local $SIG{ALRM} = sub { goto EXIT; }; alarm
1; foo(); EXIT: alarm 0; say "exited" }'
----------- следущая часть -----------
Вложение в формате HTML было извлечено&hellip;
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20100129/ef0fff44/attachment.html>


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