Ractor
진정한 병렬성을 알아봅니다
Ractor은(는) CoddyKit의 무료 Ruby Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Ruby Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Ruby Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
랙터란 무엇인가요
랙터(루비 액터)는 루비 3에서 도입된 동시성 기본 요소로, 실제 병렬성을 제공합니다. 각 랙터는 독립적으로 루비 코드를 실행하므로 두 랙터가 동시에 두 CPU 코어를 사용할 수 있습니다.
- 랙터는 변경 가능한 객체를 공유하지 않으므로 GVL의 제약을 우회할 수 있습니다.
- 메시지를 보내 서로 통신합니다.
랙터는 아직 실험적이므로 사용하면 루비가 경고를 출력합니다.
랙터 만들기
Ractor.new와 블록을 사용하여 랙터를 만듭니다. 블록은 병렬로 실행됩니다. 블록의 최종 값을 가져오려면 take을 사용합니다.
r = Ractor.new do
2 + 3
end
puts r.take공유 상태 없음
가장 중요한 규칙은 랙터가 변경 가능한 객체를 자유롭게 공유할 수 없다는 것입니다. 랙터 블록은 일반 블록처럼 바깥쪽 지역 변수를 캡처하지 않습니다. 데이터를 명시적으로 전달해야 합니다.
이러한 격리 덕분에 잠금 없이도 병렬 실행을 안전하게 수행할 수 있습니다.
인수 전달하기
Ractor.new에 전달한 인수는 블록 매개변수로 전달됩니다. 이것이 랙터에 데이터를 보내는 안전한 방법입니다.
r = Ractor.new(10) do |x|
x * x
end
puts r.take메시지 보내기
랙터에는 메시지 수신함이 있습니다. ractor.send(value)로 메시지를 보내고 블록 내부에서는 Ractor.receive로 받습니다.
r = Ractor.new do
msg = Ractor.receive
"got: " + msg
end
r.send("hello")
puts r.take밀어넣기와 가져오기
두 가지 통신 방향이 있습니다.
- 밀어넣기:
send로 랙터에 보내고Ractor.receive로 읽습니다. - 가져오기: 랙터가
Ractor.yield로 값을 양도하면 바깥에서take으로 읽습니다.
이 두 방식을 함께 사용하면 랙터로 파이프라인을 구성할 수 있습니다.
r = Ractor.new do
Ractor.yield 1
Ractor.yield 2
end
puts r.take
puts r.take동결된 공유 가능 객체
일부 객체는 변경할 수 없기 때문에 랙터 사이에서 공유 가능합니다. 예를 들면 true, false, nil, 숫자, 기호, 깊이 동결된 객체가 있습니다.
Ractor.make_shareable은 객체 그래프를 동결하여 안전하게 공유할 수 있게 합니다.
data = Ractor.make_shareable([1, 2, 3])
puts "Frozen? " + data.frozen?.to_s복사와 이동
공유할 수 없는 객체를 보내면 랙터는 기본적으로 이를 깊이 복사하여 양쪽이 각자의 객체를 갖게 합니다. 대신 send(obj, move: true)를 사용해 객체를 이동할 수도 있으며, 이 경우 소유권이 이전되고 원본은 사용할 수 없게 됩니다.
이동하면 큰 객체를 복사하는 비용을 피할 수 있습니다.
병렬 작업
CPU를 많이 사용하는 작업을 여러 랙터에 나누고 결과를 수집합니다. 각 랙터가 독립적으로 실행되므로 여러 코어를 사용할 수 있습니다.
ractors = (1..3).map do |n|
Ractor.new(n) do |x|
x * 100
end
end
results = ractors.map(&:take)
puts "Results: " + results.join(", ")랙터와 스레드 비교
비교:
- 스레드는 메모리를 공유하므로 잠금이 필요하지만, 랙터는 격리되어 메시지가 필요합니다.
- 스레드는 루비의 CPU 작업을 병렬화하지 못하지만, 랙터는 병렬화합니다.
- 랙터는 더 엄격하므로 많은 동시성 버그를 방지합니다.
그 대신 데이터를 공유하는 규칙이 더 엄격합니다.
랙터를 사용할 때
다음과 같은 경우 랙터를 선택하십시오:
- CPU를 많이 사용하는 작업이 있고 하나의 프로세스에서 여러 코어를 사용하려는 경우
- 공유 상태로 인한 버그를 피하기 위해 격리가 필요한 경우
랙터는 실험적인 기능이라는 점을 기억하십시오. API가 변경될 수 있으며, 아직 많은 젬이 랙터를 안전하게 지원하지 않습니다.
빠른 확인
랙터에 대한 이해도를 확인해 보십시오.
복습: 랙터
랙터를 사용한 프로세스 내부 병렬 실행을 배웠습니다:
Ractor.new는 코드를 병렬로 실행하고,take는 그 결과를 가져옵니다.- 인수나
send를 사용해 데이터를 전달하고,Ractor.receive로 받습니다. - 객체는 자유롭게 공유하는 대신 복사하거나 이동합니다.
Ractor.make_shareable은 안전하게 공유할 수 있도록 데이터를 동결합니다.
이로써 스레드, GVL, 파이버, 랙터를 다루는 루비 동시성 과정을 마쳤습니다.
자주 묻는 질문
“Ractor” 강의는 무료인가요?
네 — “Ractor” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Ruby Academy 강의 전체를 잠금 해제할 수 있습니다. Ruby Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“Ractor”에서 뭘 배우나요?
진정한 병렬성을 알아봅니다 브라우저에서 직접 실행하는 실습 코드로 Ruby Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Ruby Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Ruby Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“Ractor” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Ruby Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Ruby Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.