2010-03-11 9 views

답변

2

http://ruby-doc.org/core/classes/Thread.html

x = 2 
Thread.new do 
    x = 3 
end 
x = 4 

더 후 2 개 코어 2 프로세서를 가진 진정한 동시성이 필요합니다 -하지만 구현은 단일 스레드 (예 : MRI로) 인 경우가 작동하지 않을 수 있습니다.

0

http://ruby-doc.org/core/classes/Thread.html
JRuby 스레드에서만 실제로 병렬 처리됩니다 (다른 해석기는 GIL을 구현 함). here에서 :

# mutexsyncex.rb 
require 'thread' # For Mutex class in Ruby 1.8 

# A BankAccount has a name, a checking amount, and a savings amount 
class BankAccount 
    def initialize(name, checking, savings) 
    @name,@checking,@savings = name,checking,savings 
    @lock = Mutex.new # For thread safety 
    end 

    # Lock account and transfer money from savings to checking 
    def transfer_from_savings(x) 
    @lock.synchronize { 
     @savings -= x 
     @checking += x 
    } 
    end 

    # Lock account and report current balances 
    def report 
    @lock.synchronize { 
     "#@name\nChecking: #@checking\nSavings: #@savings" 
    } 
    end 
end 

ba = BankAccount.new('me', 1, 400) 

ba.transfer_from_savings(10); 
puts ba.report 
15

동시에 두 개의 스레드를 실행하려면 전체 실행 스택이이를 수행 할 수 있어야합니다. 상단에서 시작해 보겠습니다.

  1. 루비 자체는 동시에 두 개의 스레드를 실행할 수 있지만 아무런 문제가 없습니다. 그러나 Ruby는 단지 프로그래밍 언어 일뿐입니다. 에 프로그램을 실행하려면 루브 구현이 필요합니다. 불행히도 많은 유명한 Ruby 구현은 이 아니며 MRI, YARV 및 Rubinius를 포함하여 동시에 여러 스레드를 실행할 수 있습니다.이 아닙니다. 실제로 생산 준비가 완료된 Ruby 구현 스레드를 동시에 실행하는 것은 JRuby입니다. (IronRuby도 있지만 최종 1.0 릴리스는 아마도 며칠 거리에 있지만 아직 기술적으로 준비가되어 있지는 않습니다.)
  2. JRuby (와 IronRuby)는 실제로 쓰레드를 구현하지 않고 단지 기본 플랫폼의 쓰레드만을 사용합니다. 나는. JRuby는 Ruby 스레드를 JVM 스레드에 매핑하고 IronRuby는이를 CLI 스레드에 매핑합니다. 따라서 기본 플랫폼은 병렬로 스레드를 실행할 수 있어야합니다.
  3. 다시 : JVM과 CLI는 기본적으로 병렬로 스레드를 실행할 수 있지만 JVM과 CLI는 단지 사양 일 뿐이며 단지 종이 조각 일뿐입니다. 코드를 실행하려면 해당 사양을 구현해야하며, 모두 을 수행하면이 진정으로 동시 스레드를 지원하지는 않습니다.
  4. 심지어 플랫폼 구현이 진정으로 동시 스레드를 지원하는 경우 JRuby가 JVM에 위임 한 것처럼 스레드 구현을 기본 OS에 위임 할 수 있습니다. .NET, Mono, HotSpot 및 JRockit (예 : CLI 및 JVM에서 가장 많이 사용되는 구현)은 플랫폼 스레드에 원시 OS 스레드를 사용합니다. 따라서 OS는 스레드를 병렬로 실행할 수 있어야합니다. 그리고 다시 : 그들 모두가 아닙니다.
  5. 물론 하나의 CPU 만 있으면 OS의 모든 병렬 처리가 도움이되지 않습니다. 두 개의 스레드를 동시에 실행하려면 두 개의 CPU, 두 개의 코어 또는 두 개의 동시 하드웨어 스레드가 필요합니다.
+4

"하나의 CPU 만 있으면 OS의 모든 병렬 처리가 도움이되지 않습니다."- 쓰레드가 관련 작업을 간단하게 처리 할 수 ​​있다는 점에 유의할 가치가 있습니다. 진정한 평행을 이루지 못합니다. 코드 자체가 작업 전환을 처리 할 필요가없는 경우 "수행중인 작업"이 더 명확하게 표현 될 수있는 경우가 많이 있습니다. 예를 들어 UI 스레드와 작업자 스레드가 동시에 실행되지 않더라도 OS가 처리하는 스레드 간 전환을 예로들 수 있습니다. – RHSeeger

+1

@RHSeeger : 그래, 비동기 프로그래밍을위한 스레드를 사용하면 틀림없이 작동합니다. 그러나 질문은 비동기 프로그래밍에 대해서는 언급하지 않았지만 특히 "동시에"라고 말하면서 하나 이상의 CPU가 필요합니다. (비록 당신이 스레드를 사용할 수있는 거의 모든 문제에 대해, 다른 것을 사용하는 훨씬 더 나은 솔루션이 있다고 생각합니다. 예를 들어 비동기 프로그래밍의 경우, Functional Reactive Programming과 같은 것을 선호합니다. 동시성 에이전트, 액터, 조인 패턴, 선물 또는 소프트웨어 트랜잭션 메모리) –

+0

örg : 충분히 공정합니다. 일반적으로 스레드가 가장 자주 내 목록의 첫 번째 선택이 아니라는 것에 동의합니다. 그러나 사용 가능한 언어 및 라이브러리에 따라 때때로 "표현이 풍부한"코드를 생성하기위한 합리적인 선택입니다. – RHSeeger

1

첫째, 나는거야 귀하의 질문에 대답 해요 :

thread_1 = Thread.new do 
    #do something here 
end 

thread_2 = Thread.new do 
    #do something here 
end 

thread_1.join 
thread_2.join(timeout_in_seconds) 

Thread#join이 결합 된 스레드가 완료 될 때까지 기다려야 메인 스레드를 만든다.시간 제한을 초 단위로 지정하면 Ruby는 해당 시간 초과에 도달 한 후에 스레드를 닫습니다.

사실, Matz Ruby Interpreter (MRI)와의 루비 1.8에는 실제 동시성이 없으며 하나의 프로세서만으로는 실제 동시성이 없습니다. this page에 따르면

그러나,이 실행의 일환으로, 인터프리터도 Global Interpreter Lock의 인스턴스를 인스턴스화 (또는 그 이상의 애정을 GIL라고도 함) 동시성의 우리 부족의 원인이다,

자세한 내용은이 기사를 참조하십시오.

MRI는 Green Threads을 사용하여 속이려고합니다. 즉, Ruby 인터프리터는 OS가 아니라 다른 종류의 스레드와 관련된 모든 것을 처리합니다. 즉, 실제로 동시 발생하는 스레드를 원시 스레드라고하고 Ruby 1.9는 YARV를 통해 그들을 지원하지만 YARV가 전역 VM 잠금 (전역 인터프리터 잠금 또는 GIL)을 가지고 있기 때문에 모든 Ruby 스레드가 병렬로 실행된다는 것을 의미하지 않으므로 동시성은 루비의 신화이며 오랜 시간 동안 유지 될 것입니다.

관련 문제