我偶然发现了一个我无法解释的奇怪行为。执行方法
def with_baton
until (baton = Baton.obtain)
sleep(2)
end
result = yield
ensure
baton.release
result
end
确保我们传递给它的块不会由多个worker并行执行,我有时会收到以下错误:
NoMethodError: undefined method `release' for nil:NilClass
lib/*hidden*/common.rb:172 in ensure in with_baton
lib/*hidden*/common.rb:173 in with_baton
lib/*hidden*/common.rb:7 in get
如果执行超过until
,则表示baton
已设置。它nil
中的ensure
怎么可能发生?顺便说一句,该块执行约五秒钟,我使用Ruby MRI 1.9.3-p547。
答案 0 :(得分:1)
您的Baton.obtain
可能会引发错误,在这种情况下,接力棒将为nil
致电baton.release if baton