Fiber#transfer
require 'fiber'
するとFiber#transfer
が利用可能になります(開発初期段階では素のFiberとは区別されFiber::Coreという名前だったようです。
自身が表すファイバーへコンテキストを切り替えます。 自身は Fiber#resume を呼んだファイバーの子となります。 Fiber#resume との違いは、ファイバーが終了したときや Fiber.yield が呼ばれたときは、 ファイバーの親へ戻らずにメインファイバーへ戻ります。
まずfiberの中から別のfiberをresumeする例を示します。
この場合、f2.resume
の返り値はf2ファイバー自体が返す値となります。
一方Fiber#transfer
を使うと、
f2の中から、強引にf1のコンテキストに切り替えることが出来ます。
まとめ
以上でFiberの解説は終わりです。
Fiberは日々のプログラミングで気軽に使えるような機能ではないかもしれませんが、RubyにはThreadとは異なる並行処理へのアプローチがあるということ、またI/Oがコードのボトルネックになった時にパフォーマンスを改善する切り口になり得るということを覚えておくと良いと思います。
良い応用例が見つかったら、また別途記事にする予定です。