2 개의 스레드를 동시에 실행할 수있는 방법이 있습니까?Ruby에서 동시에 두 개의 스레드를 실행하려면 어떻게해야합니까?
내 응용 프로그램에 현재 기능을 실행시키고 다른 스레드가 다른 스레드를 불러 와서 첫 번째 스레드에서 변수를 바꿀 수있게하려고합니다.
2 개의 스레드를 동시에 실행할 수있는 방법이 있습니까?Ruby에서 동시에 두 개의 스레드를 실행하려면 어떻게해야합니까?
내 응용 프로그램에 현재 기능을 실행시키고 다른 스레드가 다른 스레드를 불러 와서 첫 번째 스레드에서 변수를 바꿀 수있게하려고합니다.
http://ruby-doc.org/core/classes/Thread.html
x = 2
Thread.new do
x = 3
end
x = 4
더 후 2 개 코어 2 프로세서를 가진 진정한 동시성이 필요합니다 -하지만 구현은 단일 스레드 (예 : MRI로) 인 경우가 작동하지 않을 수 있습니다.
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
동시에 두 개의 스레드를 실행하려면 전체 실행 스택이이를 수행 할 수 있어야합니다. 상단에서 시작해 보겠습니다.
첫째, 나는거야 귀하의 질문에 대답 해요 :
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 스레드가 병렬로 실행된다는 것을 의미하지 않으므로 동시성은 루비의 신화이며 오랜 시간 동안 유지 될 것입니다.
"하나의 CPU 만 있으면 OS의 모든 병렬 처리가 도움이되지 않습니다."- 쓰레드가 관련 작업을 간단하게 처리 할 수 있다는 점에 유의할 가치가 있습니다. 진정한 평행을 이루지 못합니다. 코드 자체가 작업 전환을 처리 할 필요가없는 경우 "수행중인 작업"이 더 명확하게 표현 될 수있는 경우가 많이 있습니다. 예를 들어 UI 스레드와 작업자 스레드가 동시에 실행되지 않더라도 OS가 처리하는 스레드 간 전환을 예로들 수 있습니다. – RHSeeger
@RHSeeger : 그래, 비동기 프로그래밍을위한 스레드를 사용하면 틀림없이 작동합니다. 그러나 질문은 비동기 프로그래밍에 대해서는 언급하지 않았지만 특히 "동시에"라고 말하면서 하나 이상의 CPU가 필요합니다. (비록 당신이 스레드를 사용할 수있는 거의 모든 문제에 대해, 다른 것을 사용하는 훨씬 더 나은 솔루션이 있다고 생각합니다. 예를 들어 비동기 프로그래밍의 경우, Functional Reactive Programming과 같은 것을 선호합니다. 동시성 에이전트, 액터, 조인 패턴, 선물 또는 소프트웨어 트랜잭션 메모리) –
örg : 충분히 공정합니다. 일반적으로 스레드가 가장 자주 내 목록의 첫 번째 선택이 아니라는 것에 동의합니다. 그러나 사용 가능한 언어 및 라이브러리에 따라 때때로 "표현이 풍부한"코드를 생성하기위한 합리적인 선택입니다. – RHSeeger