Установка будильника в роли - PullRequest
4 голосов
/ 26 июня 2011

У меня есть куча классов, которые выполняют различные операции в сети, и, как мы все знаем, сетевые операции иногда прерываются.Поэтому я думаю сделать что-то вроде этого:

package My::Role::NetworkFetcher { 
    use Moose::Role;

    sub BUILD { 
        my $self = shift;
        local $SIG{ALRM} = sub { 
            $self->handle_timeout;
        };

        alarm 60;
    }

    sub handle_timeout { 
        die "default timeout handler";
    }

}

Я не уверен, что это лучший способ сделать это. кажется, что работает нормально в моих очень простых тестовых случаях, но я не уверен, что угон метода BUILD объекта или локализация обработчика сигнала таким образом является правильным или даже целесообразным.

1 Ответ

2 голосов
/ 26 июня 2011

Осторожно здесь. local $ SIG {ALRM} применяется только к методу BUILD, поэтому, если вы выйдете из области действия функции, не вызывая alarm 0 , тогда произойдет обработчик ALRM по умолчаниюесли вы вышли из метода BUILD и время ожидания истекло.Безопаснее всего выполнить все в eval, чтобы не столкнуться с неясными проблемами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...