18

나는 루비를 수시로 해킹 해왔다.하지만 크거나 멀티 쓰레딩 된 것이 없다. MRI는 녹색 스레드 만 지원하고 JRuby는 JVM을 통해 원시 스레드를 지원한다고 들었습니다. 그러나 "Rails는 스레드로부터 안전하지 못하다"거나 Ruby 자체는 스레드로부터 안전하지 않다고 말하는 블로그 및 토론 그룹에 대한 의견은 비틀 거립니다. 예를 들어 누군가 require 문에 문제가 있다고 주석을 달았습니다. 그것은 약간 근본적으로 들린다.Ruby/Rails 스레드 안전성

나는 제대로 동시성을 처리하지 않는 자바 애플리케이션을 많이 보았다 나는 시간에서 시간 :-)에 그러나 적어도 당신에게 할 수있는 자바 쓰기 스레드 안전 응용 프로그램을 사용하면 경우 정말 그들에 대한 악몽이 당신이하고있는 일을 안다.

이 모든 것이 상당히 놀랍습니다. 누군가가 더 자세히 설명 할 수 있습니까? 정확하게 문제가 무엇인지, 그리고 레일즈가이 경우에 어떻게 작동합니까? 경쟁 조건이나 교착 상태없이 올바르게 작동하는 다중 스레드 루비 코드를 작성할 수 있습니까? JRuby와 MRI간에 이식성이 있습니까? 아니면 JVM 고유 스레드를 제대로 활용하려면 JVM 관련 코드를 해킹해야합니까?

편집 : 사람들이 네이티브 스레딩 대 (그 자체로 좋은) 물건과 녹색 스레딩 스레딩 레일에 대답하는 것 때문에 나는이 두 가지 질문을해야

. thread safety에 관한 핵심 Ruby 문제에 대한 내 관심사는 실제로 다루어지지 않았습니다. 경우에 따라 필요 이상으로 (해결되지 않은?) issue이있는 것으로 보입니다.

+0

중복 : http://stackoverflow.com/questions/129226/what-are-the-current-state-of-affairs-on-threading-concurrency-and-forked-proces/129331#129331 –

답변

5

MRI의 일반적인 솔루션은 여러 Rails 인스턴스를 실행하는 것입니다. 각 인스턴스는 각각 독립적으로 요청을 처리합니다. MRI는 멀티 쓰레드가 아니기 때문에 여러 개의 Rails 인스턴스를 실행할 수 없습니다. 즉, Rails가 Ruby 프로세스 당 한 번로드되기 때문에 메모리 적중을 의미합니다.

JRuby는 원시 스레드를 지원하므로 단일 JVM에서 여러 Rails 인스턴스를 항상 실행할 수 있습니다. 그러나 Rails가 스레드로부터 안전 할 경우, 메모리 사용량을 줄이고 JIT 컴파일을 줄여줍니다.

Charles Nutter (JRuby)는 nice summary입니다.

+0

감사합니다. Charles Nutter의 요약은 훌륭합니다. – auramo

1

이전 포스터가 Rails 케이스를 꽤 잘 처리했다고 생각합니다. 그래서 나는 그런 종류의 것들로 들어가는 것을 꺼려하지 않을 것입니다.

스레드 된 Ruby 응용 프로그램을 작성할 수 있습니다. 루비 스레드에 존재하는 문제 중 일부는 가상 머신이 관리하는 것처럼 '녹색'상태라는 것입니다. 현재 기본 인터프리터 (MRI)에는 통역사가 제어하는 ​​모든 스레드가 공유해야하는 하나의 진정한 시스템 스레드 만 있습니다.

단점은 여러 개의 프로세서 또는 코어가있는 컴퓨터의 경우 다른 코어에서 실행중인 응용 프로그램의 스레드를 가질 수 없다는 것입니다. 이것은 서버와 고성능 응용 프로그램을 실행하는 사람들에게는 꽤 큰 문제입니다.

귀하의 통역사 관련 코드 질문에 관해서는 : 나는 그렇게 생각하지 않습니다. AFAIK 당신은 JRuby/JVM 스레드를 돌볼 특별한 것을 할 필요가 없습니다.

또한 : This article은 Igvita에서 Ruby의 동시성 상태를 자세히 살펴 봤습니다.

14

맨 먼저 Ruby 1.9 (최신 공식 릴리스) now uses native (kernel) threads. 이전 버전의 Ruby는 녹색 스레드를 사용했습니다. 간결하게 질문에 답하기 위해, 1.9 이전에는 일반적으로 스레드가 특히 안전하지 않거나 신뢰할 수 없기 때문에 크거나 작은 Ruby 응용 프로그램에서 일반적으로 사용되지 않았습니다.

버전 2.2 이전 버전에서는 레일스가 스레드 안전을 시도하지 않았기 때문에 일반적으로 다중 프로세스, 데이터베이스 레코드 잠금 및 메시지 대기열을 사용하여 비동기 처리를 처리하기 때문에 Starling과 같은 경고가 발생했습니다. 이것은 일반적으로 웹 애플리케이션을 - 적어도 잘못 다중 스레드 된 자바 애플리케이션보다 신뢰할 수있는 - 확장 할 수있는 확실한 방법이며, 애플리케이션을 여러 개의 프로세서와 서버로 확장하는 것이 더 쉬워진다는 추가적인 장점이 있습니다.

당신이 언급 한 '요구'문제가 1.9로 해결되었는지는 잘 모르겠지만 새로운 스레드에서 라이브러리를 동적으로 필요로한다면 유지 관리 문제가 하나 이상 있다는 점을 겸허하게 감히 생각합니다.

스레드를 완전히 피하려면 Ruby 1.9 also supports fibers을 사용하십시오.이 스레드는 동시성에 대한 비공유 접근법을 사용하며, 수집 한 것보다 스레드보다 쓰고 유지하는 것이 일반적입니다. Performance numbers here.

+0

왜 * * * * "잘못 * 다중 스레드 Java 응용 프로그램"과 비교하는 것이 유용한가요? –

+0

@KirkWoll 필자는 응답자가 "스레딩이 언어에서 위험 할 때, 그 언어로는 가치가 없을 것"이라고 암시했다. – Jackson

관련 문제