0Pricing
Ruby Academy · Урок

Волокна

Кооперативный параллелизм

«Волокна» — бесплатный урок Ruby Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Ruby Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Ruby Academy содержит 4 уроков всего.

Что такое волокно

Волокно — это лёгкая единица выполнения, которой Вы управляете вручную. В отличие от потоков, волокно никогда не запускается самостоятельно: Вы явно передаёте ему управление, а оно возвращает управление обратно.

  • Это называется кооперативной конкурентностью.
  • Волокна дёшевы в создании и приостановке.
  • Они лежат в основе генераторов и асинхронного ввода-вывода в Ruby.

Создание и возобновление

Создайте волокно с помощью Fiber.new и запустите или продолжите его с помощью resume. Блок выполняется до завершения или приостановки.

fiber = Fiber.new do
  puts "Inside the fiber"
end

fiber.resume
puts "Back in main"

Приостановка с возвратом управления

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

fiber = Fiber.new do
  puts "Step 1"
  Fiber.yield
  puts "Step 2"
end

fiber.resume
puts "Main between steps"
fiber.resume

Передача значений наружу

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

fiber = Fiber.new do
  Fiber.yield 10
  Fiber.yield 20
  30
end

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

Передача значений внутрь

Аргумент resume становится возвращаемым значением Fiber.yield внутри волокна. Обмен данными происходит в обоих направлениях.

fiber = Fiber.new do
  got = Fiber.yield "ready"
  puts "Fiber received: " + got
end

puts fiber.resume
fiber.resume("hello")

Бесконечный счётчик

Поскольку волокно приостанавливается и возобновляется, с его помощью можно представить бесконечную ленивую последовательность, не вычисляя её целиком.

counter = Fiber.new do
  n = 1
  loop do
    Fiber.yield n
    n += 1
  end
end

3.times { puts counter.resume }

Проверка активности

Fiber#alive? сообщает, можно ли ещё возобновить волокно. Возобновление завершённого волокна вызывает FiberError.

fiber = Fiber.new { puts "done" }
puts "Alive before: " + fiber.alive?.to_s
fiber.resume
puts "Alive after: " + fiber.alive?.to_s

Волокна и потоки

Основные различия:

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

Перечислители используют волокна

Ленивые перечислители Ruby построены на волокнах. Внешний итератор приостанавливается между значениями так же, как волокно возвращает управление.

enum = Enumerator.new do |y|
  y << 1
  y << 2
  y << 3
end

puts enum.next
puts enum.next

Волокна и асинхронный ввод-вывод

Современный Ruby содержит механизм подключения планировщика волокон. Библиотеки, такие как библиотека async, используют его: когда одно волокно ждёт ввод-вывод, планировщик автоматически возобновляет другое волокно.

Это обеспечивает высокую конкурентность при работе с вводом-выводом, сохраняя вид обычного последовательного кода.

Когда использовать волокна

Выбирайте волокна, когда Вам нужны:

  • Ленивые генераторы, выдающие значения по мере необходимости.
  • Поток управления в стиле сопрограмм.
  • Мелкозернистое детерминированное переключение без блокировок.

Для большинства повседневных задач конкурентного выполнения проще использовать потоки или библиотеку async, которая работает на основе волокон.

Быстрая проверка

Проверьте, насколько хорошо Вы поняли работу волокон.

Повторение: волокна

Вы изучили кооперативную конкурентность с помощью волокон:

  • Fiber.new вместе с resume запускает волокно и продолжает его выполнение.
  • Fiber.yield приостанавливает выполнение и возвращает управление.
  • Значения передаются в обоих направлениях через аргументы этих операций.
  • Волокна лежат в основе перечислителей и планировщиков асинхронного ввода-вывода.

Далее: акторы Ractor, которые наконец обеспечивают настоящий параллелизм.

Часто задаваемые вопросы

Урок «Волокна» бесплатный?

Да — полный текст урока «Волокна» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Ruby Academy, подпишись на CoddyKit PRO. Курс Ruby Academy содержит 4 уроков всего.

Чему я научусь в уроке «Волокна»?

Кооперативный параллелизм Ты практикуешь Ruby Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Ruby Academy?

Предыдущий опыт не требуется. Ruby Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Волокна»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Ruby Academy?

Да. Каждый урок Ruby Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Потоки
  2. Объяснение GVL
  3. Волокна
  4. Ractors
← Назад к Ruby Academy