Skip to content

Instantly share code, notes, and snippets.

@btc
Created August 19, 2013 06:37
Show Gist options
  • Save btc/6266248 to your computer and use it in GitHub Desktop.
Save btc/6266248 to your computer and use it in GitHub Desktop.
require 'fiber'
# Call create to get a new fiber
class ReaderProcessor
def self.create(notifier)
Fiber.new do
while notifier.no_data_yet do
puts "Reader has no data yet"
Fiber.yield
end
puts "Reader has data!"
puts "Reader did some work on data!"
end
end
end
class WriterProcessor
def self.create(notifier)
Fiber.new do
notifier.set_data
puts "Writer created data!"
end
end
end
class RootFiber
@@n_fibers = 10
def initialize args
@notifier = args[:notifier]
@fibers = []
@fibers << ReaderProcessor.create(@notifier)
@fibers << WriterProcessor.create(@notifier)
end
# returns true if a fiber was executed
def try
ran = false
@fibers.each do |fiber|
if fiber.alive?
ran = true
fiber.resume
end
end
ran
end
def run
while try do
try
end
end
end
class Notifier
def initialize
@data = false
end
def set_data
@data = true
end
def no_data_yet
true if @data == false
end
end
def main
puts "Before new"
rf = RootFiber.new notifier: Notifier.new
rf.run
end
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment