문제

나는에 대해 알고"협력"threading 의 루비 사용 스레드 그린.어떻게 만들 수 있습니 진짜"OS 수준의"스레드 응용 프로그램에서 사용하기 위해서는 여러 개의 cpu 코어의 처리를 위해?

도움이 되었습니까?

해결책

업데이트와 르 s Sept2011 댓글

당신은 것 두 개의 혼란 다른 것을 여기:이 루비 프로그래밍 언어 및 특정 스레딩을 하나의 모델 특정 방식으로 구현하지 못하도 루비 프로그래밍 언어입니다.가 현재 11 주위의 다른 구현 Ruby 프로그래밍 언어 다른 독특한 스레딩 모델입니다.

(불행하게도,두 사람들의 11 구현은 실제로 생산을 위한 준비를 사용하지만,올해 말하는 번호 아마 갈니다.) (업데이트:그것은 지금 5:MRI,JRuby,YARV(통역사에 대한 루비 1.9),Rubinius 및 IronRuby).

  1. 첫 번째 구현하지 않는 실제로 이름 그것은 매우 어색한 그것을 참조하고이 정말로 짜증나 니다.그것은 가장 자주라고도"루비",도 더 짜증나고 혼동하는 것보다 더 이름이기 때문에,그것은 지도를 끝없는 사이에 혼란이 기능의 루비 프로그래밍 언어 특정 Ruby 구현합니다.

    그것은 또한 때때로"라는 MRI"("에 대한 마츠의 루비 구현"),CRuby 또는 MatzRuby.

    MRI 구현 루비 스레드로 실내에서 통역.불행하게도,허용하지 않는 스레드 그 를 예약할 수 있 병렬에서,그들은 실행할 수 있습니다 하나의 스레드에서 시간입니다.

    그러나,모든 수의 스레드 C(POSIX Threads etc.) 실행 에서 병렬 루비 쓰레드로 동작하므로,외부는 C 라이브러리,또는 MRI C 확장자를 만드는 스레드가 자신의 수도에서 실행 병행합니다.

  2. 두 번째 구현 YARV (에 대한 짧은"아직 다른 Ruby"VM). YARV 를 구현하는 루비 스레드로 또는 POSIX Windows NT 스레드, 그러나 그것을 사용하여 글로벌 통역 잠금(GIL)을 보장하는 단 하나의 루비 스레드를 실제로 수 공항에서 한 시간입니다.

    MRI,같은 스레드 C 실제로 실행한 병렬 루비 스레드입니다.

    미래에,그것은 가능는 길 을 얻을 깨 아래로 더 세분화된 잠금 장치,따라서 수 있도록 더 많 코드를 실제로 병렬로 실행되지만,그래서 멀리 떨어져 있으며,그것은 지 않도 계획 아직입니다.

  3. JRuby 를 구현하는 루비 스레드 네이티브 스레드의, 여기서"네이티브 스레드의 경우에는"JVM 분명히"을 의미 JVM 스레드".JRuby 부과 추가 잠들입니다.그래서, 지 여부는 그 실제 병렬로 실행에 따라 달라집 JVM:일부 Jvm 을 구현하 JVM 스레드 스레드 OS 부 녹색으로 스레드입니다.(주류는 Jvm 에서 일/Oracle 사용이 독점적으로 스레드 OS 이후 JDK1.3)

  4. XRuby를 구현하는 루비 스레드로 JVM 스레드. 업데이트:XRuby 은 죽었습니다.

  5. IronRuby 를 구현하는 루비 스레드 네이티브 스레드의, 여기서"네이티브 스레드의 경우에는"CLR 명을 의미 "CLR 스레드".IronRuby 부과한 추가적인 잠그기에서 그들을 그래서,그들은 병렬로 실행되는 한,당신의 CLR 지원 니다.

  6. Ruby.NET를 구현하는 루비 스레드로 CLR 스레드. 업데이트: 루비.순이가 죽었습니다.

  7. Rubinius 를 구현하는 루비 스레드 스레드 그린 에서 가상 기계.더 정확하게:이 Rubinius VM 수출 매우 가볍고,매우 유연한 concurrency/병렬 처리/non-로컬 제어 흐름을 구성,불 은"작업"다른 모든 동시 생성(에서 스레드 이 토론이지만,또한 연속 작업, 배우 고 기타 물건)이 구현에서는 순수한 루비,사용 작업입니다.

    Rubinius 할 수 없습니다(현재)계획에서 스레드,병렬 그러나 추가하지 않는 너무 많은 문제가:할 수 있습 Rubinius 미 여러 VM 인스턴스에서 여러 POSIX 스레드 parallel,정안사,옥불사 등에서 가 Rubinius 과정입니다.이후 스레드 실제로 구현 루비에서 그들이 할 수있는,어떤 다른 Ruby 체,직렬화 및 전송하는 다른 VM 에서 다른 POSIX 스레드가 있습니다.(의 동일 모델 빔 얼랑 VM 사용 SMP concurrency.그것은 이미 구현 Rubinius 배우.)

    업데이트:에 대한 정보를 Rubinius 에서 이에 대한 답변은 산탄총 VM,는 더 이상 존재하지 않습니다."새로운"C++VM 사용하지 않는 녹색 스레드가 예정된 여러 개의 Vm(i.eErlang/빔 스타일)사용하여 전통적인 단일 VM 여러는 네이티브 스레드 OS 모델처럼,하나에 의해 고용,말,CLR,모노고 JVM.

  8. MacRuby 로 밖으로 시작되는 포트의 YARV 의 상단에 Objective-C 런타임과 CoreFoundation,코코아냅니다.그 지금은 크게 달라져서 YARV 지만,AFAIK 그것은 현재 아직도 주식 같은 스레딩과 함께 모델 YARV. 업데이트: MacRuby 에 따라 달라집 사과 쓰레기 수집가 선언하는 사용되지 않고 제거 될 것이 이후 버전에서의 MacOSX,MacRuby 지 않습니다.

  9. 기경 은 루비에 대한 구현 앵무새 가상 기계.그것을 구현하지 않는 스레드가 아직,그러나, 그것은 아마도를 구현하 앵무새 스레드. 업데이트:기경 보 비활성/죽었습니다.

  10. 부상 은 루비에 대한 구현 보석/S Smalltalk VM.나는 정보가 없는 것 threading 모델 보석/S 는,어떤 threading 모델 MagLev 사용하는 경우에도 스레드도 아직 구현되는(아마도 아닙니다).

  11. HotRuby 전체 루비의 구현 자신입니다.그것은 그의 구현 YARV 바이트 코드에서 VM JavaScript.HotRuby 지원하지 않는 스레드(아직?) 그리고 때 는,그들이 할 수 없을 병렬로 실행되기 때문에,JavaScript 지원하지 않는 진정한 병렬성을 구할 수 있다.가 ActionScript 버전의 HotRuby,그러나,ActionScript 수도 있습니다 실제로 지원 parallelism. 업데이트:HotRuby 은 죽었습니다.

불행하게도,단지 두 가지의 이러한 11 구현은 루비 실제로 생산 준비:MRI 및 JRuby.

그래서,당신은 진정한 평행 스레드,JRuby 현재 만 선택되지 않는 나쁜 중 하나:JRuby 이 실제로 더 빠르 보다 MRI,틀림없이 더욱 안정적입니다.

그렇지 않으면,"classical"루비 솔루션은 사용하는 프로세스 대신 실 for parallelism.루비 핵심 라이브러리 함 Process 모듈Process.fork 방법 그것은 쉽게 죽었을 포크 또 다른 Ruby 과정입니다.또한,Ruby 표준 라이브러리 포함 배 루비(dRuby/dRb) 라이브러리할 수 있는 루비 코드에 손쉽게 배포되는 여러 프로세스,지 만 같은 컴퓨터에서도 네트워크를 통해.

다른 팁

Ruby1.8 는 녹색 쓰레드는 방법은 없을 만드는 진짜"OS 수준"thread.그러나,루비 1.9 이 있을 것이라는 새로운 기능 섬유를 만들 수 있는 실제적인 OS-level threads.불행하게도,루비 1.9 은 아직 베타 버전입니다,그것은 공정에서의 몇 개월입니다.

또 다른 대안은 사용하 JRuby.JRuby 를 구현하는 스레드 OS 수준 theads,there are no"녹색"스레드에요.최신 버전의 JRuby 는 1.1.4 및 해당하는 루비 1.8

그것은 구현에 따라 달라집:

  • MRI 없,YARV 는 가깝습니다.
  • JRuby 및 MacRuby 니다.




Ruby 폐쇄Blocks, lambdasProcs.의 활용을 폐쇄하고 다중 코어에 JRuby, 자바의 집행 편리;에 대한 MacRuby 아 GCD 의 큐.

참고할 수 있을 만들기 진짜"OS 수준의"스레드 는 것을 의미하지는 않는다는 것을 사용할 수 있는 여러 cpu 코어에 대한 병렬 처리합니다.보 예 아래입니다.

이것은 출력 간단한 루비 프로그램을 사용하는 3 개의 스레드 루비를 사용하 2.1.0:

(jalcazar@mac ~)$ ps -M 69877
USER     PID   TT   %CPU STAT PRI     STIME     UTIME COMMAND
jalcazar 69877 s002    0.0 S    31T   0:00.01   0:00.04 /Users/jalcazar/.rvm/rubies/ruby-2.1.0/bin/ruby threads.rb
   69877         0.0 S    31T   0:00.01   0:00.00 
   69877        33.4 S    31T   0:00.01   0:08.73 
   69877        43.1 S    31T   0:00.01   0:08.73 
   69877        22.8 R    31T   0:00.01   0:08.65 

당신은 여기에서 볼 수 있듯이,네 개의 스레드 OS,그러나만으로 한 상태 R 가 실행되고 있습니다.이것은 제한으로 인해 어떻게 루비 스레드 구현됩니다.



동일한 프로그램으로,지금으로 JRuby.당신이 볼 수있는 세 개의 스레드 상태 R, 즉,그들은 병렬로 실행됩니다.

(jalcazar@mac ~)$ ps -M 72286
USER     PID   TT   %CPU STAT PRI     STIME     UTIME COMMAND
jalcazar 72286 s002    0.0 S    31T   0:00.01   0:00.01 /Library/Java/JavaVirtualMachines/jdk1.7.0_25.jdk/Contents/Home/bin/java -Djdk.home= -Djruby.home=/Users/jalcazar/.rvm/rubies/jruby-1.7.10 -Djruby.script=jruby -Djruby.shell=/bin/sh -Djffi.boot.library.path=/Users/jalcazar/.rvm/rubies/jruby-1.7.10/lib/jni:/Users/jalcazar/.rvm/rubies/jruby-1.7.10/lib/jni/Darwin -Xss2048k -Dsun.java.command=org.jruby.Main -cp  -Xbootclasspath/a:/Users/jalcazar/.rvm/rubies/jruby-1.7.10/lib/jruby.jar -Xmx1924M -XX:PermSize=992m -Dfile.encoding=UTF-8 org/jruby/Main threads.rb
   72286         0.0 S    31T   0:00.00   0:00.00 
   72286         0.0 S    33T   0:00.00   0:00.00 
   72286         0.0 S    31T   0:00.09   0:02.34 
   72286         7.9 S    31T   0:00.15   0:04.63 
   72286         0.0 S    31T   0:00.00   0:00.00 
   72286         0.0 S    31T   0:00.00   0:00.00 
   72286         0.0 S    31T   0:00.00   0:00.00 
   72286         0.0 S    31T   0:00.04   0:01.68 
   72286         0.0 S    31T   0:00.03   0:01.54 
   72286         0.0 S    31T   0:00.00   0:00.00 
   72286         0.0 S    31T   0:00.01   0:00.01 
   72286         0.0 S    31T   0:00.00   0:00.01 
   72286         0.0 S    31T   0:00.00   0:00.03 
   72286        74.2 R    31T   0:09.21   0:37.73 
   72286        72.4 R    31T   0:09.24   0:37.71 
   72286        74.7 R    31T   0:09.24   0:37.80 


동일한 프로그램으로,지금으로 MacRuby.도 있레이에 병렬로 실행됩니다.이 때문입니다 MacRuby 스레드는 POSIX threads (진짜"OS 수준의"스레드 다)및가 no 난 코삼

(jalcazar@mac ~)$ ps -M 38293
USER     PID   TT   %CPU STAT PRI     STIME     UTIME COMMAND
jalcazar 38293 s002    0.0 R     0T   0:00.02   0:00.10 /Users/jalcazar/.rvm/rubies/macruby-0.12/usr/bin/macruby threads.rb
   38293         0.0 S    33T   0:00.00   0:00.00 
   38293       100.0 R    31T   0:00.04   0:21.92 
   38293       100.0 R    31T   0:00.04   0:21.95 
   38293       100.0 R    31T   0:00.04   0:21.99 


다시 한번,동일한 프로그램 하지만 지금은 좋은 오래 된 MRI.는 사실로 인해 이 구현을 사용하여 그린-스레드,단 하나의 스레드 표시

(jalcazar@mac ~)$ ps -M 70032
USER     PID   TT   %CPU STAT PRI     STIME     UTIME COMMAND
jalcazar 70032 s002  100.0 R    31T   0:00.08   0:26.62 /Users/jalcazar/.rvm/rubies/ruby-1.8.7-p374/bin/ruby threads.rb



에 관심이 있는 경우 루비 멀티-스레딩을 찾을 수 있습 보고서 디버깅을 병렬 프로그램을 사용하여 포크를 핸들러 흥미롭습니다.
에 대한 일반적인 개요 루비 internals 루비 현미경 좋은 읽기입니다.
또한, 루비 스레드이 글로벌 통역사에서 잠 C 에 Omniref 설명의 소스 코드에서 왜 루비 스레드에서 실행하지 않는다.

는 방법에 대하여 drb?그것은 진정한 멀티 스레딩 커뮤니케이션 사이에 여러 개의 프로세스,하지만 당신은 그것을 사용할 수 있습에서 지금이 1.8 고 그것은 매우 낮은 마찰.

가"시스템"모니터 이 질문에 대답.나는 실행하는 동일한 코드(아래 계산 prime 숫자)8 개의 루비 스레드에서 실행 되는 i7(4hyperthreaded-core)기계 두 경우 모두에서...첫 번째 실행으로:

jruby1.5.6(루비 1.8.7 패치 249)(2014-02-03 6586) (OpenJDK64-Bit Server VM1.7.0_75)[amd64-자바]

두 번째는:

루비 2.1.2p95(2014-05-08)[x86_64-linux-gnu]

흥미롭게도,CPU 는 높은 JRuby 스레드,하지만 완료 시간은 약간 짧에 대한 해석됩니다.그것의 종류의 어려울에서 말하는 그래프지만,두 번째는(해석 루비)실행할 사용에 대한 1/2CPUs(no 하이퍼 스레딩?)

enter image description here

def eratosthenes(n)
  nums = [nil, nil, *2..n]
  (2..Math.sqrt(n)).each do |i|
    (i**2..n).step(i){|m| nums[m] = nil}  if nums[i]
  end
  nums.compact
end

MAX_PRIME=10000000
THREADS=8
threads = []

1.upto(THREADS) do |num|
  puts "Starting thread #{num}"
  threads[num]=Thread.new { eratosthenes MAX_PRIME }
end

1.upto(THREADS) do |num|
    threads[num].join
end

를 사용하는 경우 MRI,할 수 있습니다 다음 쓰는 코드에 스레드 C 에서 하나의 확장으로 사용하거나 루비-인라인 gem.

당신이 정말로 필요한 경우 병렬 루비에서 위해 생산 수준에 시스템을(당신이 고용할 수 없습 베타)프로세스는 아마도 더 나은 대안입니다.
하지만,그것은 확실히 가치가하려고 스레드에서 JRuby 처음이다.

도에 관심이 있다면 미래의 스레딩에서 루비,당신은 당신을 찾을 수 있습이 문서 유용합니다.

여기에 몇 가지 정보에 Rinda 는 루비의 구현 Linda(병렬 처리와 분산 컴퓨팅 패러다임) http://charmalloc.blogspot.com/2009/12/linda-tuples-rinda-drb-parallel.html

기 때문에 수집에 대답하는,그래서 새로 추가니다

Update(2017-05-08)

이 문서는 아주 오래된,그리고 정보를 따르지 않는 현재 (2017 년)밟,다음은 몇 가지 보충:

  1. Opal 은 루비 JavaScript 원-소스 컴파일러입니다.그것은 또한 그것의 구현 루비 corelib,그것은 현재 매우 활성화 develompent,그리고 존재의 큰 거래(프론트 엔드)프레임워크에 대한 작업을 수행했습니다.고 생산을 준비합니다.기 때문에 기초에 자바스크립트,그것은 지원하지 않을 병행 스레드입니다.

  2. truffleruby 높은 성능의 구현 루비 프로그래밍 언어입니다.에 내장되어 GraalVM Oracle 연구소,TruffleRuby 포 JRuby 과 결합,코드에서 Rubinius 프로젝트하고,또한 코드를 포함하는 표준에서의 구현은 루비,MRI,여전히 살 개발,생산을 준비합니다.이 버전은 루비처럼 보이 태어난 성능을 위해,내가 알지 못하는 경우 지원을 병행 스레드,하지만 그것을 생각해야합니다.

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