Fiberとは

今回の記事では、Fiberについて解説します。Fiberは Rubyにおける並行処理とスレッド・プロセスの機能 で解説した"Thread"に似ていますが、Threadにはない特徴を備えています。

RubyリファレンスマニュアルからFiberクラスの説明を引用してみましょう。

ノンプリエンプティブな軽量スレッド(以下ファイバーと呼ぶ)を提供します。 他の言語では coroutine あるいは semicoroutine と呼ばれることもあります。 Thread と違いユーザレベルスレッドとして実装されています。

class Fiber | Ruby 2.1.0 リファレンスマニュアル

概要は書かれている通りですが、より基礎的なところから別の言葉で説明を試みます。

プリエンプティブ(Thread) vs 協調的(Fiber)

コンピュータにおいて、マルチタスクのスケージューリング方式には大きく分けて"Preemptive"と"Cooperative"の二種類があります。

Preemptive方式ではタスク自身が実行スケジュールをコントロールせず、OS(あるいはVM)に処理の切り替えを任せるものです。そもそも"preemption"とは「横取り」を意味します。Preemptiveなマルチタスクとは、途中で処理が別タスクに横取りされる可能性のある方法、と呼ぶことも出来ます。

Rubyでは前々回の記事で取り上げたThreadクラスが、Preemptive方式に相当します。

それに対して"Cooperative"「協調的」なマルチタスクとは、タスク自身が「終わりましたので次どうぞ」と処理を親に返す方式です。ノンプリエンプティブ、とも呼ばれます。

Rubyにおいて、この協調的なタスクを扱うクラスがFiberなのです。

スレッドは生成されてすぐに処理が開始されますが、Fiberは処理の開始タイミングをコントロールできます。そのほか、「処理を途中まで実行しておいてストップし、また好きなタイミングで続きを実行する」ことも可能です。

次のページでは、実際のコードでFiberの使い方を見ていきます。