Fiber#transfer

require 'fiber' するとFiber#transferが利用可能になります(開発初期段階では素のFiberとは区別されFiber::Coreという名前だったようです。

自身が表すファイバーへコンテキストを切り替えます。 自身は Fiber#resume を呼んだファイバーの子となります。 Fiber#resume との違いは、ファイバーが終了したときや Fiber.yield が呼ばれたときは、 ファイバーの親へ戻らずにメインファイバーへ戻ります。

instance method Fiber#transfer | Ruby2.1.0リファレンスマニュアル

まずfiberの中から別のfiberをresumeする例を示します。

この場合、f2.resumeの返り値はf2ファイバー自体が返す値となります。

一方Fiber#transferを使うと、

f2の中から、強引にf1のコンテキストに切り替えることが出来ます。

まとめ

以上でFiberの解説は終わりです。

Fiberは日々のプログラミングで気軽に使えるような機能ではないかもしれませんが、RubyにはThreadとは異なる並行処理へのアプローチがあるということ、またI/Oがコードのボトルネックになった時にパフォーマンスを改善する切り口になり得るということを覚えておくと良いと思います。

良い応用例が見つかったら、また別途記事にする予定です。



※記事内容は執筆時点のものです。最新の内容をご確認ください。
※OSやアプリ、ソフトのバージョンによっては画面表示、操作方法が異なる可能性があります。