本文簡要介紹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 Fiber.schedule用法及代碼示例
- Ruby Fiber.new用法及代碼示例
- Ruby Fiber.backtrace_locations用法及代碼示例
- Ruby Fiber.scheduler用法及代碼示例
- Ruby Fiber.backtrace用法及代碼示例
- Ruby Fiber類用法及代碼示例
- 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.transfer。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。