Волокна
Кооперативный параллелизм
«Волокна» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Потоки
- Объяснение GVL
- Волокна
- Ractors