Простой пример никогда не блокируется - PullRequest
1 голос
/ 07 апреля 2010

Я пытаюсь что-то сделать с "neverblock", и я не могу заставить его работать.
Что я ожидаю: блокирующий сон не должен замедлять весь процесс. Я ожидал увидеть 5 раз "бла" с практически одинаковой отметкой времени.

Ruby:

$ 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 ]

1 голос
/ 08 апреля 2010

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

Волокна запланированы с использованием приостановки и возобновления - поскольку вы не используете ни в этом примерекод будет выполняться последовательно.NeverBlock, насколько я понимаю, использует FiberPool в сочетании с драйверами баз данных с поддержкой Fiber и событий, чтобы интеллектуально приостанавливать и возобновлять работу Fibers по мере необходимости для обработки событий ввода-вывода.

1 голос
/ 20 апреля 2010

Сделайте это:

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

И это должно работать!

1 голос
/ 07 апреля 2010

вам нужно "заморозить" свое время.
Time.now всегда будет выполняться при вызове

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