문제

저는 저의 작업을 위해 Ruby에서 작업 예약 앱을 작성하고 있습니다 (주로 주어진 주파수에서 다양한 프로토콜을 사용하여 파일을 이동하기 위해)

내 메인 루프는 다음과 같습니다.

while true do
  # some code to launch the proper job
  sleep CONFIG["interval"]
end

그것은 매력처럼 작동하지만 응용 프로그램이 CPU 집약적 인 소프트웨어가 실행중인 서버에서 실행될 수 있기 때문에 충분히 안전한 지 확실하지 않습니다.

같은 일을하는 또 다른 방법이 있습니까? sleep() 제 경우에는 충분히 안전합니까?

도움이 되었습니까?

해결책

빠르고 더러운 것들을 위해서는 수면을 사용하는 것이 좋을 것입니다. 그러나 조금 더 견고 함이나 신뢰성이 필요한 것들에 대해서는 수면이 악하다고 제안합니다 :) 수면의 문제는 실이 진정으로 잠들고 있다는 것입니다 - 스케줄러가 스레드를 실행하지 않을 것입니다. 수면 간격이 지나갈 때까지.

이 기간 동안 스레드는 아무것도 깨어나지 않습니다. 이것은 취소 할 수 없거나 어떤 종류의 이벤트를 처리하기 위해 일어나지 않을 것임을 의미합니다. 물론, 그 과정은 죽을 수 있지만, 수면 실은 깨어나서 깨끗하게 할 수있는 기회를주지 않습니다.

나는 루비에 익숙하지 않지만 여러 가지를 기다릴 수있는 일종의 시설이 있다고 생각합니다. 가능하다면 잠을 자지 않고 두 가지에 대해 를 사용하는 것이 좋습니다.

  1. 스레드를 주기적으로 깨우는 타이머.
  2. 프로세스 할 때 설정된 이벤트는 취소 또는 상당히 (예 : Control-C 트래핑)가 필요합니다.

작업의 필요성을 알리는 데 사용할 수있는 일종의 이벤트가 있다면 더 나을 것입니다. 이것은 타이머의 폴링을 피할 수 있습니다. 이는 일반적으로 리소스 활용도가 낮아지고 반응 형 시스템이 더 낮아집니다.

다른 팁

차단해야 할 필요가있을 때마다 이벤트 루프를 사용합니다. 보통 libev. 루비 바인딩은 다음과 같습니다.

http://rev.rubyforge.org/rdoc/

원래, sleep 백그라운드에서 다른 일을하지 않고 프로세스가 잠을 자고 싶다면 완벽하게 괜찮습니다. 그러나 수면과 같은 다른 일을하고 TCP 연결이나 파일 핸들이 읽을 수있을 때까지 기다리려면 이벤트 루프를 사용해야합니다. 그렇다면 왜 처음에 하나를 사용하지 않습니까?

응용 프로그램의 흐름은 다음과 같습니다.

main {
   Timer->new( after => 0, every => 60 seconds, run => { <do your work> } )
   loop();
}

다른 일을하고 싶을 때, 당신은 단지 감시자를 만들고, 그것은 당신을 위해 일어납니다. (당신이 운영하는 직업은 또한 감시자를 만들 수 있습니다.)

정확한 간격이 필요하지 않으면 나에게 의미가 있습니다. 드리프트없이 정기적으로 깨어나야한다면 아마도 외부 타이머를 사용하고 싶을 것입니다. 그러나 잠들 때 CPU 리소스를 사용하지 않습니다. 비싼 작업 스위치입니다.

하는 동안 sleep(timeout) 일부 디자인에 완벽하게 적합하며 명심해야 할 중요한 경고가 하나 있습니다.

루비는 신호 처리기를 설치합니다 SA_RESTART (보다 여기),, 당신의 의미 sleep (또는 동등한 select(nil, nil, nil, timeout)) 쉽게 방해받을 수 없습니다. 신호 핸들러가 발사되지만 프로그램은 바로 sleep. 예를 들어 적시에 반응하기를 원한다면 이것은 불편할 수 있습니다. SIGTERM.

고려해 ...

#! /usr/bin/ruby
Signal.trap("USR1") { puts "Hey, wake up!" }
Process.fork() { sleep 2 and Process.kill("USR1", Process.ppid) }
sleep 30
puts "Zzz.  I enjoyed my nap."

... 2가 아닌 실행하는 데 약 30 초가 걸립니다.

해결 방법으로, 당신은 대신 신호 핸들러에 예외를 던질 수 있으며, 이는 위의 수면 (또는 다른 것들)을 방해 할 수 있습니다. 당신은 또한 a로 전환 할 수도 있습니다 select-기반 루프 및 변형을 사용합니다 셀프 파이프 트릭 신호를 받으면 "일찍"일어나기 위해. 다른 사람들이 지적했듯이, 완전한 기능을 갖춘 이벤트 라이브러리도 제공됩니다.

자고있는 동안 CPU를 사용하지는 않지만 오랫동안 자고 있다면 Ruby 통역사가 아무것도하지 않는 동안 기억을 유지하는 것에 대해 더 걱정할 것입니다. 이것은 그다지 큰 거래가 아닙니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top