Spec-Zone.ru › Ruby 2.2

класс Fiber

Родитель:
Объект

Волокна — это примитивы для реализации лёгкого кооперативного конкурентного программирования в Ruby. По сути, это способ создания блоков кода, которые могут приостанавливаться и возобновляться, очень похоже на потоки. Основное различие заключается в том, что они никогда не прерываются, а планирование должно выполняться программистом, а не виртуальной машиной.

В отличие от других моделей безстековых лёгких конкурентных задач, каждое волокно имеет небольшой стек объёмом 4 КБ. Это позволяет волокну приостанавливаться из глубоко вложенных вызовов функций внутри блока волокна.

Когда создаётся волокно, оно не запускается автоматически. Вместо этого его нужно явно запустить, используя метод Fiber#resume. Код, выполняющийся внутри волокна, может уступить управление, вызвав Fiber.yield, в этом случае он передаёт управление обратно вызывающей стороне (вызывающему методу Fiber#resume).

При передаче управления или завершении волокно Fiber возвращает значение последнего выполненного выражения

Например:

fiber = Fiber.new do
  Fiber.yield 1
  2
end

puts fiber.resume
puts fiber.resume
puts fiber.resume

дает

1
2
FiberError: dead fiber called

Метод Fiber#resume принимает произвольное количество параметров; если это первый вызов resume, они будут переданы в качестве аргументов блока. В противном случае они будут значением возвращаемым вызовом Fiber.yield

Пример:

fiber = Fiber.new do |first|
  second = Fiber.yield first + 2
end

puts fiber.resume 10
puts fiber.resume 14
puts fiber.resume 18

дает

12
14
FiberError: dead fiber called

Публичные Классовые Методы

current() → fiber Показать исходный код
static VALUE
rb_fiber_s_current(VALUE klass)
{
    return rb_fiber_current();
}

Возвращает текущее волокно. Вам нужно require 'fiber' перед использованием этого метода. Если вы не работаете в контексте волокна, этот метод вернёт корневое волокно.

yield(args, ...) → obj Показать исходный код
static VALUE
rb_fiber_s_yield(int argc, VALUE *argv, VALUE klass)
{
    return rb_fiber_yield(argc, argv);
}

Возвращает управление контексту, который возобновил волокно, передавая любые аргументы, переданные ему. Волокно возобновит обработку в этом месте, когда resume будет вызвано в следующий раз. Любые аргументы, переданные следующему resume, будут значением, которое это Fiber.yield выражение вычисляет.

Публичные Экземплярные Методы

alive? → true или false Показать исходный код
VALUE
rb_fiber_alive_p(VALUE fibval)
{
    rb_fiber_t *fib;
    GetFiberPtr(fibval, fib);
    return fib->status != TERMINATED ? Qtrue : Qfalse;
}

Возвращает true, если волокно всё ещё может быть возобновлено (или переключено). После завершения выполнения блока волокна этот метод всегда возвращает false. Вам нужно require 'fiber' перед использованием этого метода.

resume(args, ...) → obj Показать исходный код
static VALUE
rb_fiber_m_resume(int argc, VALUE *argv, VALUE fib)
{
    return rb_fiber_resume(fib, argc, argv);
}

Возобновляет волокно с точки, в которой был вызван последний Fiber.yield, или начинает его выполнение, если это первый вызов resume. Аргументы, переданные в resume, будут значением Fiber.yield выражения или будут переданы в качестве параметров блока для блока волокна, если это первый resume.

В качестве альтернативы, при вызове resume, он вычисляется в аргументах, переданных следующему Fiber.yield оператору внутри блока волокна, или в значении блока, если он выполняется до конца без каких-либо Fiber.yield

transfer(args, ...) → obj Показать исходный код
static VALUE
rb_fiber_m_transfer(int argc, VALUE *argv, VALUE fibval)
{
    rb_fiber_t *fib;
    GetFiberPtr(fibval, fib);
    fib->transferred = 1;
    return fiber_switch(fib, argc, argv, 0);
}

Переносит управление в другое волокно, возобновляя его с точки, в которой оно остановилось, или запускает его, если оно не было возобновлено ранее. Вызывающее волокно будет приостановлено, подобно вызову Fiber.yield. Вам нужно require 'fiber' перед использованием этого метода.

Волокно, которое получает вызов передачи, обрабатывает его так же, как вызов возобновления. Аргументы, переданные в transfer, обрабатываются как аргументы, переданные в resume.

Вы не можете возобновить волокно, которое передало управление другому. Это вызовет ошибку двойного возобновления. Вам нужно передать управление обратно этому волокну, прежде чем оно сможет уступить управление и возобновить.

Пример:

fiber1 = Fiber.new do
  puts "In Fiber 1"
  Fiber.yield
end

fiber2 = Fiber.new do
  puts "In Fiber 2"
  fiber1.transfer
  puts "Never see this message"
end

fiber3 = Fiber.new do
  puts "In Fiber 3"
end

fiber2.resume
fiber3.resume

дает

In fiber 2
In fiber 1
In fiber 3

Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API