Bird
Raised Fist0
Rubyprogramming~5 mins

Ractor for true parallelism in Ruby - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is a Ractor in Ruby?
A Ractor is a Ruby feature that allows true parallel execution by running code in separate, isolated threads with their own memory.
Click to reveal answer
intermediate
How do Ractors communicate with each other?
Ractors communicate by sending messages through channels using methods like send and take, ensuring thread safety without shared memory.
Click to reveal answer
intermediate
Why can't Ractors share mutable objects directly?
Because Ractors have isolated memory to avoid race conditions, mutable objects cannot be shared directly; they must be copied or sent as immutable data.
Click to reveal answer
beginner
Show a simple example of creating a Ractor that returns a value.
r = Ractor.new { 5 * 5 } result = r.take puts result # Outputs 25
Click to reveal answer
intermediate
What is the benefit of using Ractors over traditional threads in Ruby?
Ractors provide true parallelism by running on multiple CPU cores safely, avoiding the Global Interpreter Lock (GIL) limitations of traditional Ruby threads.
Click to reveal answer
What does a Ractor in Ruby provide?
AShared memory multithreading
BSingle-threaded execution
CTrue parallelism with isolated memory
DSynchronous blocking calls only
How do Ractors exchange data safely?
ABy sending messages through channels
BBy accessing the same object directly
CBy sharing global variables
DBy using locks and mutexes
Which Ruby version introduced Ractors?
ARuby 3.0
BRuby 2.7
CRuby 3.1
DRuby 3.2
What happens if you try to share a mutable object between Ractors?
AIt works normally
BRuby raises an error or copies the object
CThe object becomes frozen automatically
DThe program crashes
Which method retrieves a value sent from a Ractor?
Aget
Bsend
Creceive
Dtake
Explain how Ractors achieve true parallelism in Ruby and why this is important.
Think about how Ractors run code separately and communicate.
You got /4 concepts.
    Describe the steps to create a Ractor that calculates a value and returns it to the main program.
    Focus on creation, execution, and getting the result.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is the main purpose of using Ractor in Ruby?
      easy
      A. To run code truly in parallel on multiple CPU cores
      B. To create graphical user interfaces
      C. To handle database connections
      D. To write single-threaded scripts

      Solution

      1. Step 1: Understand Ractor's role

        Ractor is designed to enable true parallel execution in Ruby, using multiple CPU cores.
      2. Step 2: Compare options

        Options A, B, and C do not relate to parallelism or CPU core usage.
      3. Final Answer:

        To run code truly in parallel on multiple CPU cores -> Option A
      4. Quick Check:

        Ractor = true parallelism [OK]
      Hint: Ractor means real parallel tasks in Ruby [OK]
      Common Mistakes:
      • Confusing Ractor with threads
      • Thinking Ractor is for UI or database
      • Assuming Ractor runs code sequentially
      2. Which of the following is the correct way to create a new Ractor in Ruby?
      easy
      A. Ractor.new { puts 'Hello from Ractor' }
      B. Thread.new { puts 'Hello from Ractor' }
      C. Process.spawn { puts 'Hello from Ractor' }
      D. Fiber.new { puts 'Hello from Ractor' }

      Solution

      1. Step 1: Identify Ractor creation syntax

        Ractor is created using Ractor.new with a block of code to run in parallel.
      2. Step 2: Eliminate other options

        Thread, Process, and Fiber are different concurrency tools, not Ractor.
      3. Final Answer:

        Ractor.new { puts 'Hello from Ractor' } -> Option A
      4. Quick Check:

        Use Ractor.new to create Ractors [OK]
      Hint: Ractor.new starts a parallel task [OK]
      Common Mistakes:
      • Using Thread.new instead of Ractor.new
      • Confusing Process.spawn with Ractor
      • Using Fiber.new which is cooperative, not parallel
      3. What will be the output of this Ruby code using Ractor?
      r = Ractor.new { 5 * 5 }
      result = r.take
      puts result
      medium
      A. RactorError
      B. 5 * 5
      C. nil
      D. 25

      Solution

      1. Step 1: Understand Ractor block execution

        The block { 5 * 5 } runs inside the Ractor and returns 25.
      2. Step 2: Use take to get the result

        r.take receives the value returned by the Ractor block, which is 25.
      3. Final Answer:

        25 -> Option D
      4. Quick Check:

        Ractor returns 25, take receives it [OK]
      Hint: Ractor block returns value, take fetches it [OK]
      Common Mistakes:
      • Expecting string '5 * 5' instead of calculation
      • Confusing take with yield
      • Assuming nil or error without communication
      4. Identify the error in this Ractor code snippet:
      r = Ractor.new do
        Ractor.yield 10
        20
      end
      puts r.take
      puts r.take
      medium
      A. Ractor.new requires arguments
      B. Second r.take call will cause Ractor::Closed error
      C. No error, code runs fine
      D. Calling Ractor.yield inside Ractor block is invalid

      Solution

      1. Step 1: Understand Ractor.yield and r.take

        Ractor.yield sends a value to the main thread, and r.take receives it. The first r.take gets 10.
      2. Step 2: Analyze second r.take call

        The block returns 20 after yield, which is the final value. The second r.take gets 20. After that, the Ractor is closed. A third r.take would cause error, but here only two calls are made, so no error.
      3. Step 3: Check the code carefully

        Both r.take calls are valid; no error occurs.
      4. Final Answer:

        No error, code runs fine -> Option C
      5. Quick Check:

        Ractor.yield and take work twice safely [OK]
      Hint: Ractor.yield sends values, take receives them sequentially [OK]
      Common Mistakes:
      • Thinking Ractor.yield is invalid inside Ractor
      • Expecting error on second take call
      • Assuming Ractor.new needs arguments
      5. You want to sum numbers from 1 to 100 using two Ractors running in parallel, each summing half the range. Which code correctly implements this?
      hard
      A. r1 = Ractor.new { (1..100).sum } r2 = Ractor.new { (1..100).sum } puts r1.take + r2.take
      B. r1 = Ractor.new { (1..50).sum } r2 = Ractor.new { (51..100).sum } puts r1.take + r2.take
      C. r1 = Thread.new { (1..50).sum } r2 = Thread.new { (51..100).sum } puts r1.value + r2.value
      D. r1 = Ractor.new { (1..50).reduce(:+) } r2 = Ractor.new { (51..100).reduce(:+) } puts r1.take * r2.take

      Solution

      1. Step 1: Split the range correctly

        We want two Ractors, one summing 1 to 50, the other 51 to 100.
      2. Step 2: Check the operations and combining results

        r1 = Ractor.new { (1..50).sum } r2 = Ractor.new { (51..100).sum } puts r1.take + r2.take sums each half and adds results correctly. r1 = Ractor.new { (1..100).sum } r2 = Ractor.new { (1..100).sum } puts r1.take + r2.take sums full range twice (wrong). r1 = Thread.new { (1..50).sum } r2 = Thread.new { (51..100).sum } puts r1.value + r2.value uses Thread, not Ractor. r1 = Ractor.new { (1..50).reduce(:+) } r2 = Ractor.new { (51..100).reduce(:+) } puts r1.take * r2.take multiplies sums instead of adding.
      3. Final Answer:

        r1 = Ractor.new { (1..50).sum } r2 = Ractor.new { (51..100).sum } puts r1.take + r2.take -> Option B
      4. Quick Check:

        Split range, sum halves, add results [OK]
      Hint: Split work, sum halves in Ractors, then add [OK]
      Common Mistakes:
      • Using Thread instead of Ractor
      • Summing full range twice
      • Multiplying sums instead of adding
      Recommended

      Ready to prove it?

      Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

      10 questions~5 mineasy hard