用于提供一个非独占的轻量型纤程(即Fiber),也就是其他编程语言中的协程/半协程。
一个纤程的环境通常不会改变,除非做出了明确的说明。纤程也是要进行承接的,比如Fiber#resume(即程序出现错误后继续运行下一行的语句)是母纤程,而Fiber则是子纤程(不过这个母子并没有从属关系)。不遵循由母纤程到子纤程的规则的过程是不被允许的(比如由子纤程到母纤程的过渡),这会导致出现一个FibberError(纤程错误)的异常。以下两条是可以被允许的:
当然,这里的母子关系是动态的,并且在环境切换回母纤程的同时,这种关系即告解除。
当一个纤程结束,环境将会自动切换回母纤程。
纤程是用来在某一个运行节点上切换程序运行环境,并最终恢复原先的环境的方法。Fiber.new函数可以创建一个包含区块的新纤程,使用Fiber#resume函数则可以切换到它所定义的纤程运行环境之中,Fiber.yield则可以在子纤程中运行以将运行环境切换到母纤程之中。Fiber.yield函数的参数是Fiber#resume函数在母纤程中的返回值。
f = Fiber.new do n = 0 loop do Fiber.yield(n) n += 1 end end 5.times do p f.resume end #=> 0 1 2 3 4
创建并返回一个包含着区块的纤程。区块中使用到的参数则需要在开头加以指定.
当区块执行结束时,运行环境会跳转至母纤程。而区块的运算结果也在同时被返回。
a = nil f = Fiber.new do |obj| a = obj :hoge end b = f.resume(:foo) p a #=> :foo p b #=> :hoge
将运行环境切换至当前纤程的母纤程。
当运行环境切换完毕之后,yield 方法会将给定的参数返回到 Fiber#resume 。
对于参数 arg ,指定一个对象传递到当前纤程的母纤程中。
a = nil f = Fiber.new do a = Fiber.yield() end f.resume() f.resume(:foo) p a #=> :foo
将运行环境切换至调用者的子纤程。
当运行环境被切换的时候,resume 方法会将参数返回给 Fiber.yield 。
对于参数 arg, 指定一个对象传递到调用者所代表的纤程中。
f = Fiber.new do Fiber.yield(:hoge) end a = f.resume() f.resume() p b #=> :hoge