0

我正在使用gem从 Ideone.com 获取代码结果。gem 将代码提交给 Ideone,然后检查结果页面。它检查timeout时间,如果没有结果则放弃。问题是它可能放弃得太早,但如果没有结果,我也不希望它等待太久。有没有办法知道什么时候应该放弃希望?

这是相关代码:

   begin
      sleep 3  if i > 0
      res = JSON.load(
        Net::HTTP.post_form(
          URI.parse("http://ideone.com/ideone/Index/view/id/#{loc}/ajax/1"),
          {}
        ).body
      )
      i += 1
    end while res['status'] != '0' && i < timeout

    if i == timeout
      raise IdeoneError, "Timed out while waiting for code result."
    end
4

1 回答 1

1

听起来您想调整睡眠超时和尝试次数参数。没有适合每种情况的绝对值,因此您应该选择一些最适合您的应用程序的值。

不幸的是,gem 代码对这两个参数(3 秒延迟和 4 次尝试)进行了硬编码,因此您没有一种优雅的方式来更改它们。因此,您可以分叉 gem 并更改其代码,或者尝试使用http://apidock.com/ruby/Module/const_set对 TIMEOUT 常量的值进行猴子修补。但是,如果不重写 gem 的 .run 方法,您将无法对尝试值之间的延迟进行猴子修补。

供参考。Net::HTTP 有自己的超时时间——等待 ideone.com 连接和响应的时间。如果超过了 Net::HTTP 会引发超时异常。二传手是

http://ruby-doc.org/stdlib-2.0/libdoc/net/http/rdoc/Net/HTTP.html#method-i-read_timeout-3D和#open_timeout=。

于 2013-07-30T11:17:53.157 回答