本文简要介绍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 Fiber.schedule用法及代码示例
- Ruby Fiber.transfer用法及代码示例
- Ruby Fiber.new用法及代码示例
- Ruby Fiber.backtrace_locations用法及代码示例
- Ruby Fiber.scheduler用法及代码示例
- Ruby Fiber.backtrace用法及代码示例
- Ruby FiberError类用法及代码示例
- Ruby File.identical?用法及代码示例
- Ruby FileUtils.mkdir用法及代码示例
- Ruby FileUtils.compare_file用法及代码示例
- Ruby FileUtils.options_of用法及代码示例
- Ruby File.dirname用法及代码示例
- Ruby FileUtils.ln_s用法及代码示例
- Ruby Fiddle.dlwrap用法及代码示例
- Ruby File.directory?用法及代码示例
- Ruby FileUtils.install用法及代码示例
- Ruby File.link用法及代码示例
- Ruby FileUtils.chown_R用法及代码示例
- Ruby File.expand_path用法及代码示例
- Ruby FileUtils.cp_lr用法及代码示例
- Ruby File.lstat用法及代码示例
- Ruby File.umask用法及代码示例
- Ruby FileUtils.rmdir用法及代码示例
- Ruby File.absolute_path?用法及代码示例
- Ruby FileUtils.rm_rf用法及代码示例
注:本文由纯净天空筛选整理自ruby-lang.org大神的英文原创作品 Fiber类。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。