Ruby Timeout :: timeout不会触发Exception,也不会返回记录的内容

Pas*_*sta 10 ruby timeout ruby-on-rails rescue

我有这段代码:

begin
  complete_results = Timeout.timeout(4) do      
    results = platform.search(artist, album_name)
  end
rescue Timeout::Error
  puts 'Print me something please'
end 
Run Code Online (Sandbox Code Playgroud)

然后我启动包含此代码的方法,以及这里是堆栈跟踪的开始:

Exception message :  execution expired
Exception backtrace :  /***/****/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/timeout.rb:64:i

所以我天真地认为我的通话时间已经过去了.但是,"打印我喜欢的东西"永远不会被打印出来,并且complete_results假设是超时状态返回值(无论是真还是假,如文档中所提到的),最终都不是布尔值.

难道我做错了什么?

Dav*_*ulc 20

你的代码是正确的

require 'timeout'
begin
  complete_results = Timeout.timeout(1) do      
   sleep(2)
  end
rescue Timeout::Error
  puts 'Print me something please'
end
Run Code Online (Sandbox Code Playgroud)

打印出来"请打印我的东西".

尝试上面的基本代码.如果这样可行,那你就有问题了platform.search.


Joh*_*hir 5

问题是platform.search正在捕获Timeout#timeout throws.

您可以通过将内部代码包装在另一个线程 - YMMV 中来解决此问题。

begin
  complete_results = Timeout.timeout(4) do
    Thread.new{ results = platform.search(artist, album_name) }.value
  end
rescue Timeout::Error
  puts 'Print me something please'
end 
Run Code Online (Sandbox Code Playgroud)

  • 我最近在这里描述并可能解决了这个问题:http://code.jjb.cc/2012/09/15/sane_timeout-a-replacement-for-rubys-standard-library-timeout/ (2认同)