0Pricing
Ruby Academy · レッスン

Fiber

協調的な並行処理です。

「Fiber」はCoddyKit上の無料Ruby Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはRuby Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Ruby Academyコースには全4レッスンが含まれています。

ファイバーとは何ですか

Fiberは、手動で制御する軽量な実行単位です。スレッドとは異なり、ファイバーは自動的に実行されません。明示的に制御を渡すと実行し、制御を戻します。

  • これは協調的並行性と呼ばれます。
  • ファイバーは低コストで作成および一時停止できます。
  • Rubyにおけるジェネレーターと非同期I/Oの基盤です。

作成と再開

Fiber.newでファイバーを作成し、resumeで実行または再開します。ブロックは、処理が完了するか一時停止するまで実行されます。

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

fiber.resume
puts "Back in main"

yieldによる一時停止

Fiber.yieldはファイバーを一時停止し、resumeを呼び出した側に制御を戻します。次のresumeでは、yieldの直後から実行が再開されます。

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の箇所でのみ切り替わります。
  • ファイバーは実行するのが常に1つで、切り替え箇所も明示されるため、競合状態を避けられます。

Enumeratorはファイバーを使う

Rubyの遅延列挙子はファイバーを基盤にしています。外部イテレーターは、ファイバーがyieldするのと同じように、値と値の間で一時停止します。

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

puts enum.next
puts enum.next

ファイバーと非同期I/O

最新のRubyにはファイバースケジューラーフックが組み込まれています。async gemなどのライブラリはこれを利用し、あるファイバーがI/Oで待機すると、スケジューラーが別のファイバーを自動的に再開します。

これにより、通常の逐次実行コードのように読めるコードで、高い並行性のI/O処理を実現できます。

ファイバーを使う場面

次のような場合はファイバーを検討してください。

  • 必要に応じて値を生成する遅延ジェネレーター
  • コルーチン形式の制御フロー
  • ロックを使わず、細かく決定的に切り替える処理

日常的な並行処理の多くでは、スレッドまたは内部でファイバーを使うasync gemのほうが簡単です。

確認問題

ファイバーについての理解度を確認しましょう。

まとめ:ファイバー

ファイバーを使った協調的並行性について学びました。

  • Fiber.newとresumeでファイバーを実行および継続します。
  • Fiber.yieldはファイバーを一時停止して、制御を戻します。
  • yieldとresumeの引数を介して、値を両方向に受け渡せます。
  • ファイバーは列挙子と非同期I/Oスケジューラーを支えています。

次はRactorです。Ractorによって、ついに真の並列性を実現できます。

よくある質問

「Fiber」レッスンは無料ですか?

はい。「Fiber」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Ruby Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Ruby Academyコースには全4レッスンが含まれています。

「Fiber」で何を学びますか?

協調的な並行処理です。 ブラウザで直接実行するハンズオンコードでRuby Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Ruby Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのRuby Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「Fiber」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このRuby Academyレッスンでコードを書いて実行できますか?

はい。すべてのRuby Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. スレッド
  2. GVL の解説
  3. Fiber
  4. Ractor
← Ruby Academyに戻る