2013-08-22 145 views
0

我无法理解,为什么此代码不起作用。 我想要做的是使用光纤模拟同步代码行为。在异步方法恢复光纤

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 

当我运行此代码,输出为:

$ ruby fiber_poc.rb 
    Fiber Started 
    Resuming Fiber 

,纤维是再也没有恢复。 你能解释我该怎么做?

谢谢你们

回答

1
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 

你会得到

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

感谢@ fl00r。很好的接收。为什么线程无法使用?不管怎么说,还是要谢谢你 ! – CHAPa

+2

您不能在线程中使用Fibers – fl00r