2010-04-07 54 views
1

我試圖用「neverblock」做一些事情,但我似乎無法使其工作。
我的期望:阻塞睡眠不應該減慢整個過程。我預計會看到基本上相同時間戳的5次「bla」。簡單的從不阻止示例不起作用

紅寶石:

$ 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.now將始終運行病毒,當你調用它

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

這是想法...我想看看什麼時候纖維被實際執行。據我瞭解,他們應該基本上並行執行(非阻塞),他們似乎不是 – 2010-04-07 15:28:06

+0

我試過幾次測試neverblock - 沒有結果。紅寶石1.8.6 – fl00r 2010-04-07 16:13:42

1

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

纖維使用掛起和恢復被安排 - 因爲你不使用任何在這個例子中,代碼會按順序運行。根據我的理解,NeverBlock使用FiberPool與光纖和事件感知數據庫驅動程序結合使用,以根據需要智能暫停和恢復光纖以處理I/O事件。

+0

如果這是真的,我不明白在這篇文章中作者提供的示例:http://oldmoe.blogspot.com/2008/11/ruby-networking-on-steroids.html(「第二,我們將創建一個客戶端,向服務器發出請求「) – 2010-04-08 17:45:00

+0

這個例子可能已經過時 - 當我運行它(經過一些調整,因爲一些NeverBlock API已經改變),它會順序執行請求。 – 2010-04-08 18:57:41

1

這樣做:

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 

,它應該工作!