Search code examples
rubyruby-1.9fibers

Resuming Fiber on Async Method


I am not able to understand, why this code doesn't work. What I'm trying to do is emulate the synchronous code behavior using fiber.

require 'fiber'
require 'eventmachine'

def async_request(url)
  f = Fiber.current
  Thread.new do
    sleep 0.3
    puts 'Resuming Fiber'
    f.resume('page fetched #{url}')
  end
end


def async_get(url)
  async_request url
  val = Fiber.yield
  return val
end

EM.run do 

  Fiber.new do
    puts 'Fiber Started'
    page = async_get('http://www.whatever.com')
    puts page
  end.resume

end

When I run this code, the output is :

$ ruby fiber_poc.rb
  Fiber Started
  Resuming Fiber

The Fiber is never Resumed. Could You explain how can I do that ?

Thanks guys


Solution

  • require 'fiber'
    require 'eventmachine'
    
    def async_request(url)
      f = Fiber.current
      EM.add_timer(0.3) do
        puts 'Resuming Fiber'
        f.resume("page fetched #{url}")
      end
    end
    
    def async_get(url)
      async_request url
      Fiber.yield
    end
    
    EM.run do 
      Fiber.new do
        puts 'Fiber Started'
        page = async_get('http://www.whatever.com')
        puts page
        EM.stop
      end.resume
    end
    

    you will get

    #=> Fiber Started
    #=> Resuming Fiber
    #=> page fetched http://www.whatever.com