Skip to content

Instantly share code, notes, and snippets.

@dsisnero
Forked from tompng/broadcast.rb
Created February 2, 2021 00:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dsisnero/ac22266cf1cad1374d00056aa641ba79 to your computer and use it in GitHub Desktop.
Save dsisnero/ac22266cf1cad1374d00056aa641ba79 to your computer and use it in GitHub Desktop.
class Broadcaster
attr_reader :ractor
def initialize
@ractor = new_ractor
end
def new_ractor
Ractor.new { Ractor.recv rescue nil }
end
def broadcast(message)
next_ractor = new_ractor
@ractor.define_singleton_method(:next) { next_ractor }
frozen_message = message.dup.freeze
@ractor.define_singleton_method(:message) { frozen_message }
@ractor.close
@ractor = next_ractor
end
class Receiver
def initialize(ractor)
@ractor = ractor
end
def recv
@ractor.take rescue nil
message = @ractor.message
@ractor = @ractor.next
message
end
end
end
bc = Broadcaster.new
4.times do |i|
Ractor.new i, bc.ractor do |i, r|
rec = Broadcaster::Receiver.new r
loop do
message = rec.recv
puts "ractor#{i} received #{message}"
end
end
end
(1..).each do |i|
bc.broadcast "hello#{i}"
sleep 1
end
__END__
ractor0 received hello1
ractor1 received hello1
ractor2 received hello1
ractor3 received hello1
ractor3 received hello2
ractor1 received hello2
ractor0 received hello2
ractor2 received hello2
ractor1 received hello3
ractor2 received hello3
ractor0 received hello3
ractor3 received hello3
...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment