Fiberメモ
require 'fiber' def io_switch f = Fiber.current $h.add_watch(:f, proc{ $h.remove_watch(:f) f.transfer }) $h.switch end class Hub def initialize @process @wait = Hash.new end def add_watch(key,block) @wait[key] = block end def remove_watch(key) @wait.delete(key) end def run while true sleep(1) p "fire event" @wait.each_value{|value| value.call } end end def switch @process ||= Fiber.new{ run } @process.transfer end end $h = Hub.new f1 = Fiber.new{ p "start 1" io_switch p "restart 1" } f2 = Fiber.new{ p "start 2" io_switch p "restart 2" $h.switch } f1.resume f2.resume
よくわからんけどresumeだとこけたのでtransferで切り替え。
Fiberは戻り先の親を指定できないのかな。