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
4

3 に答える 3

1

あなたはあなたの時間を「凍結」する必要があります。
Time.nowあなたがそれを呼んでいるときは常にそれ自体を実行します

time = Time.now
5.times do
  fiber_pool.spawn do
    puts "bla @ #{time}"
    sleep 1
  end
end
于 2010-04-07T15:23:50.673 に答える
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

そしてそれはうまくいくはずです!

于 2010-04-20T16:23:25.010 に答える
1

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

ファイバーはサスペンドとレジュームを使用してスケジュールされます。この例ではどちらも使用しないため、コードは順次実行されます。私が理解しているように、NeverBlock は、FiberPool をファイバーおよびイベント対応データベース ドライバーと組み合わせて利用し、I/O イベントを処理するために必要に応じてファイバーをインテリジェントに一時停止および再開します。

于 2010-04-07T21:15:51.820 に答える