Fare attenzione alla gestione del segnale. Perl riceve segnali in modo asincrono e possono essere persi o interferire l'uno con l'altro se viene ricevuto un segnale mentre un altro segnale viene gestito dalla richiamata. Supporto Win32
librerie di gestione degli eventi è abbastanza così così in Perl (devo sostenere non Cygwin Win32), così ho generalmente utilizzare un ciclo di polling semplice per i timeout:
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);
Il timer di spegnimento può essere facilmente reso configurabile dall'utente o del chiamante e, a meno che non si stia facendo un ciclo estremamente stretto o si abbiano più chiamanti in attesa sul loop (dove si può finire con una gara o blocco morto), è un semplice, affidabile e incrociato -modo semplice per implementare un timeout.
Si noti inoltre che l'overhead del loop significa che non è possibile garantire che il timeout sia osservato in modo assoluto. $ test_condition, il decremento, la garbage collection, ecc. possono interferire.
fonte
2010-03-11 14:48:57
La tua valutazione è vulnerabile a un bug sgradevole. Leggi i documenti Try :: Tiny per una spiegazione dettagliata: http://search.cpan.org/perldoc?Try::Tiny – daotoad