2013-09-21 2 views
0

루비에서 x 초마다 특정 작업을 수행하려면 어떻게해야합니까? 나는 Time.now.to_i를 사용하여 epoch에 대해 한 번 시도해 보았습니다. Time.now_i가 실행되는 작업을 두 번째로 안타했지만 successfuly하지 않았으므로 누군가 x 축마다 함수를 실행하는 방법에 대한 작은 예제를 보여줄 수 있습니까? 초?매 x 분 초마다 핑 기능 사용

시도 : 누군가가 뭔가를 할 수있는 코드를 생성 할 수 있다면 그것은 예를 들면 무엇을해야 그래서 뭐, 루비에 다음에 무엇을 어떻게/모르기 때문에 내가 거기에 코드를 중단

def interval(timeout,function,*data) 
    now = Time.now.to_i 
    tasktime = Time.now.to_i + timeout 
    taskfunction = function 
    taskdata = data 
end 

당신이 말하는 것 기능에 대한 간격을 설정하면이 예제,

def say(word) 
    puts word 
end 

는, 데이터가 "단어"가 될 것이다 다음은 그 기능을 초

답변

1

, 오류는 계속 실행으로 오염되고, 정확하지 않을 것입니다. 사실, 각 반복은 주어진 간격보다 오래 걸릴 것입니다.

아래에 표시된 대답은 반복마다 매시간 지연을 조정합니다.

module Kernel 
    def tick_every sec, &pr 
    Thread.new do loop do 
     pr.call 
     t = Time.now.to_f 
     frac = t.modulo(sec.to_f) 
     sleep(sec - frac) 
    end end 
    end 
end 

thread = tick_every(2) do 
    puts "foo" 
end 
... 
some_other_tasks 
... 
thread.kill 
+0

이 방법은 작동하지만이 작업을 수행하는 동안 다른 기능을 실행하려고하면 "foo"실행이 완료 될 때까지 실행되지 않습니다. 다른 방법으로 2 초 정도 걸릴 수 있지만 다른 기능을 실행할 수 있습니까? – anakin

+0

'Thread do ... end'에 넣으십시오. 사실은 처음에는 그걸 가지고 있었지만 그것을 없앴습니다. 방금 돌려 놨어. – sawa

+0

오해의 소지가 있었을 수도 있습니다. 나는 그것을 편집했다. – sawa

2

요의 모든 X의 양을 실행할 것 같은 Kernel#sleep 방법을 사용할 수 있습니다. 여기

는 것은 매 2 초마다 끊임없는 단어를두고이 방법은, 동 기적으로 (다른 루비 코드가 될 때까지 기다려야 의미 포스트

+0

이 방법을 사용하면 잠자기 동안 다른 코드를 실행할 수 있습니까? 또는 x 초 동안 다른 모든 코드의 실행을 중지합니까? ping을 실행할 수 있어야하고 다른 작업을 계속 수행해야합니다. 다시 보내려면 대기해야합니다. – anakin

+1

"sleep"명령은 루비 프로세스를 차단합니다. 그 동안 다른 코드를 실행해야하는 경우 ping 호출을 처리하는 cronjob을 만들 수 있습니다. 또는 언제든지 (https://github.com/javan/whenever) 언제든지 보석을 사용할 수 있습니다. 예를 들어 스레드와 비동기 적으로 코드를 실행합니다. – Mattherick

1

에게 있습니다 이 실행은 끝났습니다 (..endless .. :). 당신은 단순히 sleep 시간의 일정 금액에 대한 다른 답변에 제안하는 경우

def say(word) 
    while true do 
    t = Time.now.to_f 
    puts word 
    frac = t.modulo(2.to_f) 
    sleep(2 - frac) 
    end 
end 
+0

2 초마다 반복하지 않습니다. 그것보다 더 걸릴 것입니다. 'puts word '를 실행하고 루프의 시작으로 돌아가는 데 걸리는 시간을 고려하지 않았습니다. – sawa

+0

That 's true 네, 저는 그것을 고쳤습니다 (당신의 대답 @ sawa;에서 추출했습니다)). – Mattherick

관련 문제