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


Ruby Fiber.transfer用法及代碼示例

本文簡要介紹ruby語言中 Fiber.transfer 的用法。

用法

transfer(args, ...) → obj

將控製權轉移到另一根光纖,從上次停止的地方恢複它,如果之前沒有恢複,則啟動它。調用光纖將被暫停,就像調用 Fiber.yield 一樣。

接收轉接調用的光纖將其視為恢複調用。傳遞給 transfer 的參數被視為傳遞給 resume 的參數。

傳入和傳出光纖的兩種控製方式(一種是 resume Fiber::yield ,另一種是傳入和傳出光纖的 transfer )不能自由混合。

  • 如果 Fiber 的生命周期從傳輸開始,它將永遠無法讓步或恢複控製傳遞,隻能完成或傳輸回。 (它仍然可以恢複其他允許恢複的光纖。)

  • 如果 Fiber 的生命周期從 resume 開始,它可以讓出或轉移到另一個 Fiber ,但隻能以與它被放棄的方式兼容的方式接收控製權:如果它已經轉移,它隻能被轉移返回,並且如果它已經屈服,它隻能恢複返回。之後,它再次可以轉移或屈服。

如果違反了這些規則,則會引發 FiberError

對於單獨的 Fiber 設計,yield/resume更容易使用( Fiber 隻是放棄控製權,不需要考慮控製權給誰),而對於複雜的情況,傳輸更靈活,允許構建相互依賴的 Fibers 的任意圖。

例子:

manager = nil # For local var to be visible inside worker block

# This fiber would be started with transfer
# It can't yield, and can't be resumed
worker = Fiber.new { |work|
  puts "Worker: starts"
  puts "Worker: Performed #{work.inspect}, transferring back"
  # Fiber.yield     # this would raise FiberError: attempt to yield on a not resumed fiber
  # manager.resume  # this would raise FiberError: attempt to resume a resumed fiber (double resume)
  manager.transfer(work.capitalize)
}

# This fiber would be started with resume
# It can yield or transfer, and can be transferred
# back or resumed
manager = Fiber.new {
  puts "Manager: starts"
  puts "Manager: transferring 'something' to worker"
  result = worker.transfer('something')
  puts "Manager: worker returned #{result.inspect}"
  # worker.resume    # this would raise FiberError: attempt to resume a transferring fiber
  Fiber.yield        # this is OK, the fiber transferred from and to, now it can yield
  puts "Manager: finished"
}

puts "Starting the manager"
manager.resume
puts "Resuming the manager"
# manager.transfer  # this would raise FiberError: attempt to transfer to a yielding fiber
manager.resume

produces

Starting the manager
Manager: starts
Manager: transferring 'something' to worker
Worker: starts
Worker: Performed "something", transferring back
Manager: worker returned "Something"
Resuming the manager
Manager: finished

相關用法


注:本文由純淨天空篩選整理自ruby-lang.org大神的英文原創作品 Fiber.transfer。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。