Ruby勉強

インターネットの企画職な人がプログラミングを勉強するブログ

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