当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Ruby Fiber类用法及代码示例


本文简要介绍ruby语言中 Fiber类 的用法。

Fiber 是在 Ruby 中实现轻量级协作并发的原语。本质上,它们是一种创建可以暂停和恢复的代码块的方法,就像线程一样。主要区别在于它们永远不会被抢占,并且调度必须由程序员而不是 VM 来完成。

与其他无堆栈的轻量级并发模型不同,每条光纤都带有一个堆栈。这使得纤程可以从纤程块内的深层嵌套函数调用中暂停。请参阅 ruby(1) 联机帮助页来配置光纤堆栈的大小。

创建光纤时,它不会自动运行。相反,必须明确要求它使用 Fiber#resume 方法运行。在光纤中运行的代码可以通过调用 Fiber.yield 来放弃控制,在这种情况下,它会将控制权交还给调用者( Fiber#resume 的调用者)。

在产生或终止时, Fiber 返回最后执行的表达式的值

例如:

fiber = Fiber.new do
  Fiber.yield 1
  2
end

puts fiber.resume
puts fiber.resume
puts fiber.resume

produces

1
2
FiberError: dead fiber called

Fiber#resume 方法接受任意数量的参数,如果它是第一次调用 resume ,那么它们将作为块参数传递。否则它们将是调用 Fiber.yield 的返回值

例子:

fiber = Fiber.new do |first|
  second = Fiber.yield first + 2
end

puts fiber.resume 10
puts fiber.resume 1_000_000
puts fiber.resume "The fiber will be dead before I can cause trouble"

produces

12
1000000
FiberError: dead fiber called

非阻塞纤维

non-blocking fiber 的概念是在 Ruby 3.0 中引入的。非阻塞纤程,当到达通常会阻塞纤程的操作(如 sleep ,或等待另一个进程或 I/O)时,将控制其他纤程并允许 scheduler 处理阻塞和唤醒(恢复)该光纤可以继续进行时。

要使 Fiber 表现为非阻塞,需要使用 blocking: false(这是默认设置)在 Fiber.new 中创建它,并且应该使用 Fiber.set_scheduler 设置 Fiber.scheduler 。如果当前线程中没有设置 Fiber.scheduler ,阻塞和非阻塞光纤的行为是相同的。

Ruby 不提供调度器类:它预计由用户实现并对应于 Fiber::SchedulerInterface

还有 Fiber.schedule 方法,它期望以非阻塞的方式立即执行给定的块。它的实际实现取决于调度器。

相关用法


注:本文由纯净天空筛选整理自ruby-lang.org大神的英文原创作品 Fiber类。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。