2011-02-07 4 views
1

Ruby에서 루프 내부에서 카운터가 증가하는 데몬을 만들었습니다. 루프는 비즈니스를 수행 한 다음 1 초 동안 잠자고 계속됩니다. 간체는 다음과 같습니다 :Ruby의 루프에서 주기적으로 카운터를 내보내는 가장 좋은 방법은 무엇입니까

5 분마다 카운터 값을 데이터베이스에 저장하는 메소드를 호출하고 싶습니다. 나는 이것을 할 수있는 몇 가지 방법이 있다고 생각한다. 내가 생각한 최초의 방법은 5 분, 0 초와 일치하는 것을 검사하고, 일치하면 SQL 함수를 호출하는 루프에서 Time.now를 호출하는 것이 었습니다. 그러나 send_command가 약간의 시간이 걸리면 레코드가 누락 될 수 있습니다.

또 다른 가능성은 소켓을 통해 호출 (및 재설정) 할 수있는 카운터 변수를 사용 가능하게하는 것일 수 있습니다. 간단히 Socket 클래스를 살펴 보았습니다.

누락 된 명백한/최선의 방법이 있습니까?

답변

1

매 5 분마다 저장하려는 경우 스레드 만 사용할 수 있습니다. 다음과 같음 :

Thread.new do 
    save_value_in_the_db(counter) 
    sleep 5*60 
end 

스레드는 루프와 동일한 블록에 정의되어 있으면 카운터에 액세스 할 수 있습니다. 당신은 또한 객체를 사용할 수 있고 @counter를 insidd로 선언 할 수 있습니다.

원격으로 액세스하려는 경우 소켓을 사용하거나 drb 접근 방식을 사용하는 것이 더 쉽습니다. 이 drb 튜토리얼은 여러분의 요구 사항에 맞을 것 같습니다 : http://ruby.about.com/od/advancedruby/a/drb.htm

+0

불행히도 매 5 분마다 카운터를 자주 업데이트해야합니다. 0에서 1로 변경되는 디지털 읽기입니다. 변경 사항을 계산해야하며 많은 부분이 5 분 세그먼트에서 발생할 수 있습니다. 나는 약간의 drb를했다, 그것은 단지 필요 이상으로 보였다. – markf

+0

죄송합니다. 답변을 잘못 읽었습니다. 이것은 괜찮은 선택입니다. 그리고 제가 고려할 것입니다. – markf

+0

이것은 내가 끝내주는 것입니다. 카운터에서 전역으로 이동하여 두 개의 스레드 (하나는 데이터를 수집하고 다른 하나는 데이터베이스)를 생성했습니다. 도와 주셔서 감사합니다. – markf

0

루프를 통해 매번 카운터를 업데이트 한 다음 주기적으로 카운터를 업데이트하고 데이터베이스를 업데이트해야합니다.

값을 내보내기 전에 기다릴 필요가있는 시간에주의를 기울이지 않아도되므로 기본 루프가 간단 해집니다.

그리고 일반적으로 값을 샘플링하고 그 값으로 무언가를하는 정기적 인 태스크를 갖는 것이 일반적입니다.

간단한 소켓을 만드는 것이 좋습니다. Ruby의 Socket 코드 RDoc에는 시작할 수있는 에코 서버용 샘플이 있습니다.

+0

그래, 나는 그것이 어쨌든 갈 계획이었던 곳이라고 생각합니다. 더 쉬운 방법이 있는지 나는 몰랐다. 내 다른 모니터뿐만 아니라 단일 애플 리케이션에 databasing 오프로드 socketize 수 있습니다. 확인 감사합니다. – markf

관련 문제