Ruby/Rubyの基礎知識

Fiberによる協調的な並行プログラミング

ノンプリエンプティブな軽量スレッドであるFiberを紹介し、その基本的な使い方、およびFiber#transferを用いた制限のないコンテキスト切り替えを解説します。

橋本 拓也

執筆者:橋本 拓也

Rubyガイド

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の使い方を見ていきます。

  • 1
  • 2
  • 3
  • 次のページへ

あわせて読みたい

あなたにオススメ

    表示について

    カテゴリー一覧

    All Aboutサービス・メディア

    All About公式SNS
    日々の生活や仕事を楽しむための情報を毎日お届けします。
    公式SNS一覧
    © All About, Inc. All rights reserved. 掲載の記事・写真・イラストなど、すべてのコンテンツの無断複写・転載・公衆送信等を禁じます