2013-05-09 37 views
8

Tôi muốn tìm cách đặt giới hạn thời gian trên mã ruby ​​để mã sẽ thoát sau khi giới hạn thời gian đó hết hạn.Cách đặt giới hạn thời gian cho mã Ruby chạy

+1

Tại sao không làm 'Time.new', làm X vòng, sau đó kiểm tra để xem nếu thời gian mới là hơn thời hạn của bạn sau thời gian bạn bắt đầu lúc nào? Hay bạn không có quyền kiểm soát chức năng mất nhiều thời gian để chạy? Nếu vậy, khả năng của bạn là 1) gọi nó là không đồng bộ, vì vậy mã của bạn vẫn có quyền kiểm soát và chỉ có thể bỏ sau một thời gian 2) viết một quá trình thứ hai để chấm dứt đầu tiên nếu mất quá nhiều thời gian – Patashu

Trả lời

15

Tôi không chắc chắn tại sao câu hỏi này bị giảm giá, việc này rất đơn giản với mô-đun timeout.

Điều này cho phép bạn vượt qua một khối và một khoảng thời gian. Nếu khối hoàn thành trong khoảng thời gian, giá trị được trả về. Nếu không thì một ngoại lệ sẽ bị ném. Ví dụ sử dụng:

require 'timeout' 

def run 
    begin 
    result = Timeout::timeout(2) do 
     sleep(1 + rand(3)) 
     42 
    end 
    puts "The result was #{result}" 
    rescue Timeout::Error 
    puts "the calculation timed out" 
    end 
end 

Trong sử dụng:

2.0.0p0 :005 > load 'test.rb' 
=> true 
2.0.0p0 :006 > run 
the calculation timed out 
=> nil 
2.0.0p0 :007 > run 
the calculation timed out 
=> nil 
2.0.0p0 :008 > run 
The result was 42 
=> nil 
+0

Tốt! câu trả lời. Ngắn nhưng đến điểm. Nhưng một câu hỏi là tại sao 'load', thay vì' require'? –

+1

tải là tốt hơn khi thử nghiệm một tập lệnh, vì yêu cầu sẽ không tải lại nó sau khi bạn thay đổi nó (yêu cầu theo dõi những gì bạn đã yêu cầu vì vậy cùng một kịch bản không được yêu cầu nhiều lần). –

+0

Bất kỳ nguồn nào tốt để kiểm tra sự khác biệt giữa 'tải' và' yêu cầu'? Bạn có thể giới thiệu tôi không? –

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