2010-04-07 3 views
1

"결코 블로킹"으로 무언가를하려하고 있습니다. 제대로 작동하지 않는 것 같습니다.
내가 기대하는 것 : 블로킹 수면이 전체 프로세스를 늦추지 않아야합니다. 나는 기본적으로 같은 타임 스탬프로 "bla"를 5 번 볼 것으로 예상했다.단순한 블로킹 예제가 작동하지 않습니다.

루비 :

$ ruby --version 
ruby 1.9.2dev (2010-03-31 trunk 27123) [x86_64-darwin10.2.0] 

코드 :

require "neverblock" 
fiber_pool = NeverBlock::Pool::FiberPool.new(25) 

5.times do 
fiber_pool.spawn do 
    puts "bla @ #{Time.now}" 
    sleep 1 
end 
end 

결과 :

당신이 당신의 시간을 "동결"할 필요가
$ ruby test.rb 
Using Neverblock 
bla @ 2010-04-07 11:00:28 -0400 
bla @ 2010-04-07 11:00:29 -0400 
bla @ 2010-04-07 11:00:30 -0400 
bla @ 2010-04-07 11:00:31 -0400 
bla @ 2010-04-07 11:00:32 -0400 

답변

1

. 당신이 그것을 중단하고 다시 시작하여 예약 된

time = Time.now 
5.times do 
    fiber_pool.spawn do 
    puts "bla @ #{time}" 
    sleep 1 
    end 
end 
+0

그 아이디어는 ... 언제 섬유가 실제로 실행되는지 확인하고 싶습니다. 내가 이해하는 바와 같이, 그들은 기본적으로 병렬로 (비 블로킹) 수행 되어야만한다. –

+0

나는 neverblock으로 몇 가지 테스트를 시도했지만 결과는 없다. ruby 1.8.6 – fl00r

1

http://ruby-doc.org/core-1.9/classes/Fiber.html

섬유를 호출 할 때
Time.now는 항상 자신을 실행합니다 -이 예에서 코드가 순차적으로 실행됩니다 중 하나를 사용하지 않기 때문에. NeverBlock은 이해할 수 있듯이 광섬유 및 이벤트 인식 데이터베이스 드라이버와 함께 FiberPool을 사용하여 I/O 이벤트를 처리하는 데 필요한대로 Fibers를 지능적으로 일시 중단하고 다시 시작합니다.

require "neverblock" 
require "eventmachine" 

fiber_pool = NeverBlock::Pool::FiberPool.new(5) 

EM::run do 
    5.times do 
    fiber_pool.spawn do 
     puts "bla @ #{Time.now}" 
     EM.add_timer(1) do 
     EM.stop 
     end 
    end 
    end 
end 

을 그리고 그것은 작동합니다 :

+0

이것이 사실이라면 나는이 기사의 저자가 제공 한 예제를 이해하지 못한다 : http://oldmoe.blogspot.com/2008/11/ruby-networking-on-steroids.html (" 둘째로 서버에 요청을 보낼 클라이언트를 생성합니다. ") –

+0

예가 오래되었을 수 있습니다 - NeverBlock API가 변경되어 약간의 조작을 한 후 실행했을 때 순차적으로 요청을 실행했습니다 . –

관련 문제