Chăm sóc xử lý tín hiệu. Perl nhận tín hiệu không đồng bộ và chúng có thể bị mất hoặc can thiệp với nhau nếu tín hiệu được nhận trong khi tín hiệu khác đang được xử lý bởi cuộc gọi lại. hỗ trợ Win32
tổ chức sự kiện xử lý thư viện là khá cái như vậy trong Perl (Tôi có để hỗ trợ phi Cygwin Win32), vì vậy tôi thường sử dụng một vòng bỏ phiếu đơn giản cho 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);
Các hẹn giờ ngủ có thể dễ dàng tạo người dùng hoặc người gọi có thể định cấu hình và trừ khi bạn đang thực hiện một vòng lặp vô cùng chặt chẽ hoặc có nhiều người gọi đang chờ vòng lặp (nơi bạn có thể kết thúc bằng cuộc đua hoặc khóa chết), nó đơn giản, đáng tin cậy và chéo cách nền tảng để triển khai thời gian chờ.
Cũng lưu ý rằng chi phí vòng lặp sẽ có nghĩa là bạn không thể đảm bảo rằng thời gian chờ được quan sát hoàn toàn. $ test_condition, sự sụt giảm, thu gom rác, v.v. có thể can thiệp.
Nguồn
2010-03-11 14:48:57
eval của bạn dễ bị lỗi nghiêm trọng. Hãy đọc phần Tài nguyên nhỏ bé để có giải thích chi tiết: http://search.cpan.org/perldoc?Try::Tiny – daotoad