简单的neverblock示例不起作用

时间:2010-04-07 15:05:09

标签: ruby fibers

我正在尝试用“永不阻挡”做某事,而我似乎无法让它发挥作用 我的期望:阻塞睡眠不应该减缓整个过程。我希望看到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

3 个答案:

答案 0 :(得分:1)

你需要“冻结”你的时间 当你调用它时,Time.now将始终自行执行

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

答案 1 :(得分:1)

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

使用suspend和resume计划光纤 - 因为在此示例中您不使用任何一个,所以代码将按顺序运行。据我所知,NeverBlock利用FiberPool与光纤和事件感知数据库驱动程序一起智能地暂停和恢复光纤,以便处理I / O事件。

答案 2 :(得分: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

它应该有效!