Skip to content

Instantly share code, notes, and snippets.

@tompng
Created April 16, 2020 10:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save tompng/3e37e704b16a9a2f087e67d801e61db7 to your computer and use it in GitHub Desktop.
Save tompng/3e37e704b16a9a2f087e67d801e61db7 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