Будьте осторожны с обработкой сигналов. Perl принимает сигналы асинхронно, и они могут быть потеряны или создавать помехи друг другу, если сигнал получен, пока обратный вызов обрабатывает другой сигнал.
Поддержка Win32 в библиотеках обработки событий довольно проста в Perl (я должен поддерживать не-cygwin Win32), поэтому я обычно использую простой цикл опроса для тайм-аутов:
use Time::HiRes qw(sleep);
sub timeout {
my $timeout = shift;
my $poll_interval = shift;
my $test_condition = shift;
until ($test_condition->() || $timeout <= 0) {
$timeout -= $poll_interval;
sleep $poll_interval;
}
return $timeout > 0; # condition was met before timeout
}
my $success = timeout(30, 0.1, \&some_condition_is_met);
Таймер сна может быть легко настроен пользователем или вызывающим абонентом, и если вы не выполняете чрезвычайно плотный цикл или если несколько абонентов ожидают в цикле (где вы можете получить гонку или блокировку), это простой, надежный и кроссплатформенный способ реализации тайм-аута.
Также обратите внимание, что издержки цикла будут означать, что вы не можете гарантировать, что тайм-аут соблюдается абсолютно. $ test_condition, декремент, сборка мусора и т. д. могут мешать.