ruby纤维:恢复转移的纤维
发布时间:2020-12-17 03:18:45 所属栏目:百科 来源:网络整理
导读:我试图了解以下代码段的行为.我特别关注Fiber#transfer方法. require 'fiber'fiber2 = nilfiber1 = Fiber.new do puts "In Fiber 1" # 3 fiber2.transfer # 4endfiber2 = Fiber.new do puts "In Fiber 2" # 1 fiber1.transfer # 2 puts "In Fiber 2 again" #
我试图了解以下代码段的行为.我特别关注Fiber#transfer方法.
require 'fiber' fiber2 = nil fiber1 = Fiber.new do puts "In Fiber 1" # 3 fiber2.transfer # 4 end fiber2 = Fiber.new do puts "In Fiber 2" # 1 fiber1.transfer # 2 puts "In Fiber 2 again" # 5 Fiber.yield # 6 puts "Fiber 2 resumed" # 10 end fiber3 = Fiber.new do puts "In Fiber 3" # 8 end fiber2.resume # 0 fiber3.resume # 7 fiber2.resume # 9 我已经编写了代码行,并在右侧执行了预期的执行顺序.一旦fiber3.resume返回并且我调用fiber2.resume,我希望执行在fiber2内的#10行继续执行.相反,我得到以下错误: fiber2.rb:24:in `resume': cannot resume transferred Fiber (FiberError) from fiber2.rb:24:in `<main>' 这是从列表的最后一行报告的错误:fiber2.resume. 解决方法
它似乎是
behavior has changed since Ruby 1.9.而在1.9中,事情就像问题提供者所假设的那样,后来的Ruby版本改变了#transfer的工作方式.我正在测试2.4,但这可能适用于2. *系列中的早期版本.
在1.9中,#transnsfer可用于在光纤之间来回跳转.有可能在那时,#resume不能用于此目的.无论如何,在Ruby 2.4中你可以使用#resume从一根光纤跳转到另一根光纤,然后只需使用Fiber.yield()跳回调用者. 示例(基于问题的代码): require 'fiber' fiber2 = nil fiber1 = Fiber.new do puts "In Fiber 1" # 3 Fiber.yield # 4 (returns to fiber2) end fiber2 = Fiber.new do puts "In Fiber 2" # 1 fiber1.resume # 2 puts "In Fiber 2 again" # 5 Fiber.yield # 6 (returns to main) puts "Fiber 2 resumed" # 10 end fiber3 = Fiber.new do puts "In Fiber 3" # 8 end fiber2.resume # 0 fiber3.resume # 7 fiber2.resume # 9 #transfer的用例现在似乎是当你有两根光纤(我们称它们为A和B)并希望从A到B时,你不打算在B完成之前回到A.但是,Ruby没有尾调用优化的概念,所以A仍然需要等待B完成并产生它的最终值.尽管如此,#transnsfer现在基本上是一张单程票. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |