Created
August 19, 2013 06:37
-
-
Save btc/6266248 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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