2012-07-08 5 views
6

알다시피, 루비 1.9는 OS 스레드를 사용하지만 실제로는 하나의 스레드 만 동시에 실행됩니다 (다른 스레드가 처리하는 동안 하나의 스레드가 IO를 차단할 수 있음). 필자가 보았던 스레딩 예제는 Thread.new을 사용하여 새 스레드를 시작합니다. Java 배경에서 볼 때 일반적으로 스레드 풀은 "헤비급"이기 때문에 많은 새 스레드로 시작하지 않습니다.루비 1.9 스레드 풀

루비에 스레드 풀 구성 요소가 내장되어 있습니까? 나는 기본 언어 라이브러리에서 하나도 보지 못했습니다. 아니면 일반적으로 사용되는 표준 보석이 있습니까? OS 레벨 스레딩은 루비의 새로운 기능이기 때문에 라이브러리가 얼마나 성숙한 지 모르겠습니다.

답변

6

기본 C 루비 인터프리터는 한 번에 하나의 스레드 만 실행한다는 점에서 옳습니다 (파이썬과 같은 다른 C 기반 동적 언어에도 비슷한 제한이 있습니다). 이 제한으로 인해 루비에서는 스레딩이 그렇게 일반적인 것이 아니기 때문에 결과적으로 기본 스레드 풀 라이브러리가 없습니다. 병렬로 수행해야하는 작업이있는 경우 일반적으로 프로세스는 여러 서버로 확장 될 수 있으므로 프로세스를 사용합니다.

스레드를 사용해야하는 경우 JRuby 플랫폼에서 https://github.com/meh/ruby-threadpool을 사용하는 것이 좋습니다.이 플랫폼은 JVM에서 실행되는 Ruby 인터프리터입니다. 골목 바로 위에 있어야하며 가상 머신에서 실행 중이기 때문에 실제 스레딩을 수행합니다.

+0

감사합니다. 저는 실제로 유스 케이스를 갖고 있지 않지만, 제가 곡괭이 책을 읽었을 때, 이것은 제가 확신 할 수없는 것이었지만 당신은 분명히했습니다. –

+12

Ruby에서는 스레드가 동시에 실행되지 않기 때문에 쓸모가 없다는 사람들이 있다는 것을 나는 이해하지 못한다. 그들은 실제로 CPU 바운드 작업에는 쓸모가 없지만 병렬로 수행하려는 모든 IO를 차단하는 데 매우 유용 할 수 있습니다. 예 : 동시 HTTP 요청 – Kamchatka

+0

코멘트 주셔서 감사합니다. Ruby에서는 쓰레드가 쓸모가 없다는 것을 명확히 할 필요가 있습니다. 쓰레드가 오버 헤드가 없기 때문에 사람들은 GIL의 한계를 인식 할 필요가 있습니다. 비 차단 IO의 경우 이벤트 C 기반 비동기 호출이 더 적합 할 수 있습니다. 자세한 내용은 http://blog.gregweber.info/posts/2011-06-16-high-performance-rb-part3을 참조하십시오. – Wulfram