當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


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