Here is the Service class.
 class Service  
   def initialize  
     @interval = 1.0  
     @start_time = Time.now   
   end  
   def start   
     # Update the start-time  
     @start_time = Time.now   
     # run loop  
     loop do  
       t_start = Time.now  
       # process the job  
       process  
       elapsed = Time.now - t_start  
       if elapsed > @interval  
         puts "Error: Job is bigger than Interval.. #{elapsed}"  
       end  
       # apply some compensation.   
       compensation = (Time.now - @start_time) % @interval  
       sleep (@interval - compensation)  
     end  
   end  
   def process  
     raise NotImplementedError  
   end  
 end  
And then, define your jobs in process method.
 class MyService < Service   
   def initialize  
     super  
     @interval = 2.0  
   end  
   def process  
     puts "time: #{Time.now.to_f.round(3)}"  
     # do the random job .. it takes upto 1.5 seconds.   
     sleep rand(150) * 0.01  
   end  
 end  
Try to run it..
 service = MyService.new  
 service.start   
And you will get a very accurate intervals
 time: 1298615010.271  
 time: 1298615011.271  
 time: 1298615012.271  
 time: 1298615013.271  
 time: 1298615014.271  
 time: 1298615015.271  
 time: 1298615016.271  
 time: 1298615017.271  
 time: 1298615018.271  
 time: 1298615019.271  
 time: 1298615020.271  
 time: 1298615021.271  
 time: 1298615022.271  
 time: 1298615023.271  
 time: 1298615024.271  
 time: 1298615025.271  
 time: 1298615026.271  
 time: 1298615027.271  
 time: 1298615028.271  
 time: 1298615029.271  
 time: 1298615030.271  
 time: 1298615031.271  
 time: 1298615032.271  
 time: 1298615033.271  
 time: 1298615034.271  
 time: 1298615035.271  
 time: 1298615036.271  
 time: 1298615037.271  
 time: 1298615038.271  
 time: 1298615039.271  
 time: 1298615040.271  
 time: 1298615041.271  
 time: 1298615042.271  
Next time, will try to fix Eventmachine timer..
1 comment:
Is this code still required or has ruby's time handling gotten better?
Post a Comment