2010-03-11 27 views
15

tôi thường xuyên sử dụng các mô hình sau để thiết lập một giới hạn trên để thời gian chạy của một đoạn mã đặc biệt trong Perl:Cách để làm thời gian chờ trong Perl?

my $TIMEOUT_IN_SECONDS = 5; 
eval { 
    local $SIG{ALRM} = sub { die "alarm\n" }; 
    alarm($TIMEOUT_IN_SECONDS); 
    # do stuff that might timeout. 
    alarm(0); 
}; 
if ([email protected]) { 
    # handle timeout condition. 
} 

Câu hỏi của tôi:

  • Đây có phải là đúng cách để làm điều đó?
  • Có bất kỳ trường hợp nào trong đó thời gian chạy có thể vượt quá $ TIMEOUT_IN_SECONDS hoặc là phương pháp chống đạn ở trên không?
+1

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

Trả lời

9

Bạn có thể muốn xem Sys::SigAction. Tôi đã không sử dụng nó bản thân mình, nhưng nó có some glowing reviews.

Một điều cần lưu ý là nếu "nội dung có thể hết thời gian chờ" tự sử dụng sleep hoặc alarm. Ngoài ra, trong mã xử lý lỗi, tôi cho rằng bạn đã chuẩn bị cho các lỗi khác ngoài thời gian chờ.

+0

bạn có thể giải thích trường hợp khi ứng dụng đang sử dụng chế độ ngủ không? Và, làm thế nào để giải quyết nó? –

2

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.

+1

Điều này không trả lời được câu hỏi. Mã này sẽ không đạt được mục tiêu tương tự như mã của OP. Nếu some_condition_is_met() không bao giờ trả về, chương trình sẽ treo. –

4

Bạn cũng có thể thử Time::Out. Tôi thích cú pháp và thời gian chờ lồng nhau được hỗ trợ ..

+1

+1 Mô-đun này xử lý tất cả những lo lắng về thời gian chờ lồng nhau vv cho bạn để bạn không phải lo lắng về tất cả các trường hợp cạnh. Đó là để báo động những gì thử :: nhỏ là để eval. – mikew

+0

Là thời gian :: Ra mô-đun luồng an toàn? Trong trường hợp của tôi, tôi cần một thời gian chờ chạy trên mỗi luồng trong ứng dụng của tôi. – reedog117

+0

@ reedog117: Tôi không biết ... –

Các vấn đề liên quan