Vorsicht bei der Signalverarbeitung. Perl empfängt Signale asynchron und sie können verloren gehen oder sich gegenseitig stören, wenn ein Signal empfangen wird, während ein anderes Signal durch den Rückruf behandelt wird.
Event-Handling-Bibliotheken Win32-Unterstützung ist ziemlich so lala in Perl (I nicht-Cygwin Win32 unterstützen müssen), so dass ich verwenden in der Regel eine einfache Abfrageschleife für Timeouts:
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);
Der Sleep-Timer kann leicht vom Benutzer oder vom Anrufer konfigurierbar gemacht werden, und es sei denn, Sie machen eine extrem enge Schleife oder haben mehrere Anrufer, die auf die Schleife warten (wo Sie mit einem Rennen oder einer toten Sperre enden können), ist es einfach, zuverlässig und kreuzend -Plattformform, um ein Timeout zu implementieren.
Beachten Sie auch, dass der Schleifenoverhead bedeutet, dass Sie nicht garantieren können, dass das Timeout absolut eingehalten wird. $ test_condition, das Dekrement, die Garbage-Collection usw. können stören.
Ihr eval ist anfällig für einen bösen Fehler. Lesen Sie die Try :: Tiny-Dokumentation für eine detaillierte Erklärung: http://search.cpan.org/perldoc?Try::Tiny – daotoad