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フィードバックを取得できます。ローカル設定は不要です。