Ruby Fiber - Silver/Gold試験対策
概要
- Fiberは、ノンプリエンプティブ(nonpreemptive)なタスクスケジューリング方式。
- Threadはプリエンプティブ(preemptive)。プリエンプティブとは先制、先取の意味がある。
- プリエンプティブである、Threadだと、例外が発生したりすると、勝手にスレッドが切り替わる。
- このThreadの挙動はこれは適切で、無限ループをわかっていながら実行し続けたりせずというOSなどもっとRawなコントロールにスケジュールを任せようということだと思う。 一方、Fiberは明示的にタスクを受け渡し宣言をすることでアプリケーションレベルでタスクスケジュールを管理できるようだ。
詳細
- resumeとはFiberのあるブロックの実行を続行(文字通りresume)する
- yieldとはFiberのブロックから、resumeした親にコンテクストを預けるというか、処理をsuspendするイメージ
f = Fiber.new do p "hoge" Fiber.yield p "fuga" end f.resume #=> "hoge" f.resume #=> "fuga"
- yieldは引数と共に、コンテクストをresumeに預ける。Fiber#resumeの返り値はその引数
f = Fiber.new do n = 3 loop do Fiber.yield(n) n += 1 end end p f.resume #=> 3。 p f.resume #=> 4。一度めのyieldの後ろを実行し、loopして、2度めのyieldで引数と共にコンテクストを返してもらう
親に例外が伝播する
f = Fiber.new do raise StandardError, "StandardError in Fiber" end begin f.resume rescue => ex p ex.message #=>"StandardError in Fiber" end
実行するFiberがない場合はFiberErrorに。
f = Fiber.new do "fiber" end p f.resume #=> "fiber" p f.resume #=> FiberError