【问题标题】:Ruby Timeout not timing outRuby Timeout 没有超时
【发布时间】:2017-07-31 08:12:00
【问题描述】:

我正在使用 firebird 数据库 gem 连接到用户指定的数据库。只要用户提供正确的数据,它就可以正常工作。如果没有,gem 将无法连接,并且需要很长时间 gem 才会抛出异常。我试过像这样使用 Timeout:timeout:

database = Fb:Database(connection_data)
Timeout::timeout(5) do
  database.connect #that's the part that takes long to connect
end

但它不会超时。它只是等待(这是一个漫长的等待,超过一分钟),并抛出 gem 异常(它不是 Timeout 异常)。看起来代码执行时间低于 5 秒(根据超时),除了它花了 1-2 分钟。我一直在寻找解释(也检查了源代码),但没有找到任何解释。我真的不想修复它(因为无论如何它都会被转移到延迟的工作中),但我想知道为什么,以及如何忽略超时。

另外,下面的代码也可以正常工作。

Timeout::timeout(5) do
  sleep(10)
end

【问题讨论】:

    标签: ruby-on-rails ruby firebird


    【解决方案1】:

    超时块在新线程中运行代码,当timeout 在 5 秒后发生时,异常被强制引发(Thread.raise 我相信)到运行database.connect 的线程中。 (Timeout module code)

    这种中断可能发生在任何线路上;在这种情况下,它可能处于某种救援块中(并在之后引发自定义错误)或任何无法正确处理它的地方,使其处于无效状态。一个库不太可能在任何地方进行防御性编码。

    您可以在this Reddit thread 中阅读更多关于使用Timeout::timeout 的问题。

    【讨论】:

      猜你喜欢
      • 2012-07-31
      • 2021-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-05
      • 2019-11-09
      • 2017-05-28
      • 1970-01-01
      相关资源
      最近更新 更多