2013-08-22 3 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 

당신은 fl00r @

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

감사를 받게됩니다. 멋지다. 왜 스레드를 사용할 수 없습니까? 어쨌든 고마워! – CHAPa

+2

스레드간에 섬유를 사용할 수 없습니다. – fl00r

관련 문제