Fiber

用于提供一个非独占的轻量型纤程(即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

特殊方法

new {|obj| ... }

创建并返回一个包含着区块的纤程。区块中使用到的参数则需要在开头加以指定.

当区块执行结束时,运行环境会跳转至母纤程。而区块的运算结果也在同时被返回。

a = nil
f = Fiber.new do |obj|
  a = obj
  :hoge
end

b = f.resume(:foo)
p a  #=> :foo
p b  #=> :hoge
yield(*arg = nil)

将运行环境切换至当前纤程的母纤程。

当运行环境切换完毕之后,yield 方法会将给定的参数返回到 Fiber#resume 。

对于参数 arg ,指定一个对象传递到当前纤程的母纤程中。

a = nil
f = Fiber.new do
  a = Fiber.yield()
end

f.resume()
f.resume(:foo)

p a  #=> :foo

实例方法

resume(*arg = nil)

将运行环境切换至调用者的子纤程。

当运行环境被切换的时候,resume 方法会将参数返回给 Fiber.yield 。 

对于参数 arg, 指定一个对象传递到调用者所代表的纤程中。

f = Fiber.new do
  Fiber.yield(:hoge)
end

a = f.resume()
f.resume()

p b  #=> :hoge