* [ruby-core:124746] [ruby-core:124711][Ruby Feature#/21869] Add receive_all Method to Ractor API for Message Batching
@ 2026-02-09 23:01 milovidovmikhail--- via ruby-core
0 siblings, 0 replies; only message in thread
From: milovidovmikhail--- via ruby-core @ 2026-02-09 23:01 UTC (permalink / raw)
To: ruby-core; +Cc: milovidovmikhail
**Summary**
The Ractor API provides an excellent mechanism for inter‑thread communication, but it currently lacks a built‑in message batching technique. I propose adding a receive_all method to enable batch processing of messages, which can significantly improve performance in high‑load scenarios.
**Motivation**
In distributed queued systems, processing messages one‑by‑one (as with the current receive method) can introduce unnecessary overhead. Batch processing allows:
Reduced context‑switching overhead.
More efficient I/O operations (e.g., fewer file writes).
Better throughput in high‑concurrency environments.
**Proposed Solution**
Add a receive_all method to the Ractor API that:
Returns all available messages in the Ractor’s mailbox at once (as an array).
**Demonstration Code**
Below is a benchmark comparing individual receive vs. batch receive_all:
``` ruby
require 'benchmark'
class RactorsTest
def initialize(count)
@count = count
@ractor1 = Ractor.new(count, 'output1.txt') do |count, filename|
File.open(filename, 'w') do |file|
while count.positive?
message = receive
file.write("Ractor 1 received message: #{message}\n")
file.flush
count -= 1
end
end
end
@ractor2 = Ractor.new(count, 'output2.txt') do |count, filename|
File.open(filename, 'w') do |file|
while count.positive?
messages = receive_all
messages.each do |message|
file.write("Ractor 2 received message: #{message}\n")
end
count -= messages.length
file.flush
end
end
end
end
def run1
@count.times do |i|
@ractor1.send("Message #{i + 1}")
end
@ractor1.join
end
def run2
@count.times do |i|
@ractor2.send("Message #{i + 1}")
end
@ractor2.join
end
end
records = 1_000_000
test = RactorsTest.new(records)
p [:once, Benchmark.realtime { test.run1 }.round(2)]
p [:all, Benchmark.realtime { test.run2 }.round(2)]
```
**Benchmark Results**
On my system, receive_all shows ~4x improvement over individual receive:
**Key Observations:**
Ractor1 (using receive): Processes each message individually, resulting in frequent I/O calls.
Ractor2 (using receive_all): Processes all queued messages at once, minimizing I/O overhead
**PR on Github**
https://github.com/ruby/ruby/pull/16105
______________________________________________
ruby-core mailing list -- ruby-core@ml.ruby-lang.org
To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2026-02-09 23:02 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-02-09 23:01 [ruby-core:124746] [ruby-core:124711][Ruby Feature#/21869] Add receive_all Method to Ractor API for Message Batching milovidovmikhail--- via ruby-core
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).