Ractor, introduced in Ruby 3.0, is an actor-model abstraction that provides parallel execution without the thread-safety concerns associated with traditional threads. Here’s what you need to know:
- Parallel Execution: Ractors allow true parallelism. Unlike threads, they don’t share everything, which simplifies handling concurrency issues.
- Creating Ractors:
- You can create a new Ractor using Ractor.new { expr }. The expression (expr) runs in parallel.
- The first Ractor invoked by the interpreter is called the “main Ractor.”
- Communication Between Ractors:
- Ractors communicate via message exchange:
- Push Type: Sender Ractor uses r.send(obj) to pass an object (obj) to another Ractor (r). The receiver uses Ractor.receive() to get the message.
- Pull Type: Sender Ractor declares an object to yield using Ractor.yield(obj), and the receiver Ractor takes it with r.take().
- Objects are copied or moved during message passing.
- Ractors communicate via message exchange:
- Sharing and Synchronization:
- Ractors don’t share everything. Most objects are unshareable, reducing thread-safety concerns.
- Immutable objects (e.g., frozen strings) are shareable.
- Ractors have limited sharing between them.
- Efficient Parallelism:
- Ractors provide faster and more efficient execution for thread-safe workers.
- Consider Ractors when building concurrent Ruby applications.
Learn more in the official documentation or explore practical examples in this blog post. Happy coding!
Published :