Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

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は戻り先の親を指定できないのかな。