Ractor (Ruby Actor, Ruby 3.0+) là đơn vị thực thi không chia sẻ state — mỗi Ractor có heap riêng, không có GIL giữa các Ractor.
Đây là cách duy nhất trong CRuby để đạt CPU parallelism thật sự.
ruby
# Thread — bị GIL giới hạn khi CPU-bound
results = (1..4).map do |i|
Thread.new { i * i } # chạy tuần tự thực sự
end.map(&:value)
# Ractor — parallel thật sự
ractors = (1..4).map do |i|
Ractor.new(i) { |n| n * n } # parallel trên multi-core
end
results = ractors.map(&:take) # => [1, 4, 9, 16]Hạn chế:
- Object chia sẻ giữa Ractor phải là frozen hoặc được move (chuyển quyền sở hữu).
- Ractor.new chỉ được truyền frozen/shareable object — mutable object phải dùng Ractor.make_shareable.
- Nhiều gem (đặc biệt dùng global state) chưa Ractor-safe.
Ractor phù hợp CPU-bound (tính toán nặng, mã hóa, image processing). Với I/O-bound, Thread vẫn đủ.