本文簡要介紹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類。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。