Skip to content

Instantly share code, notes, and snippets.

@ljones140
Last active January 4, 2021 13:53
Show Gist options
  • Save ljones140/c5bbace1c1410cb68ad770c99f318ad6 to your computer and use it in GitHub Desktop.
Save ljones140/c5bbace1c1410cb68ad770c99f318ad6 to your computer and use it in GitHub Desktop.
Ruby Ractor multiple worker example
#!/usr/bin/env ruby
class Upcaser
def process(string)
string.upcase
end
end
class Downcaser
def process(string)
string.downcase
end
end
Consumers = [Upcaser, Downcaser]
# Setup the consuming Ractors
consumers = Consumers.map do |consumer|
Ractor.new consumer do |consumer|
Ractor.yield consumer.new.process(Ractor.recv)
end
end
word = ARGV[0]
# publish the message to the consumers
consumers.map { |con|
Ractor.new con, word do |con, word|
con << word
end
}
# wait for consumer ractors to process messages
# delete them when work returned from ractor
until consumers.empty? do
r, output = Ractor.select(*consumers)
consumers.delete(r)
puts output
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment