Skip to content

Instantly share code, notes, and snippets.

@djmetzle
Last active September 25, 2023 21:04
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 djmetzle/20a96b2445f0dfb06fafe665a89d3add to your computer and use it in GitHub Desktop.
Save djmetzle/20a96b2445f0dfb06fafe665a89d3add to your computer and use it in GitHub Desktop.
Ractor Play
graph LR
    Clock-->Driver
    Driver-->Printer
    Driver-->Logger
UNITS = {
second: :sec,
minute: :min,
hour: :hour,
day: :mday,
month: :month,
year: :year,
}.freeze
def secondClock
return Ractor.new name: 'clock' do
values = {}
UNITS.each_key do |unit|
values[unit] = nil
end
loop do
sleep 0.1
now = Time.now
UNITS.keys.reverse.each do |unit|
current_unit_value = now.send(UNITS[unit])
if values[unit] != current_unit_value
values[unit] = current_unit_value
Ractor.yield ({event: unit, time: now}).freeze
end
end
end
end
end
def driver(clock, *ractors)
return Ractor.new(clock, ractors, name: 'driver') do |clock, ractors|
loop do
event = clock.take
ractors.each { |r| r.send(event) }
end
end
end
def eventPrinter
return Ractor.new(name: 'printer') do
loop do
event = Ractor.receive
puts event[:event].to_s + ": " + event[:time].to_a.to_s
end
end
end
def eventLogger
return Ractor.new(name: 'logger') do
File.delete('./clock.log')
loop do
event = Ractor.receive
log_entry = event[:event].to_s + ": " + event[:time].to_s + "\n"
File.open('./clock.log', 'a') do |log|
log.write(log_entry)
end
end
end
end
clock = secondClock
printer = eventPrinter
logger = eventLogger
driver = driver(clock, printer, logger)
Ractor.select(driver)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment