【问题标题】:When to give up on getting results from an external web service?何时放弃从外部 Web 服务获取结果?
【发布时间】:2013-07-29 16:54:03
【问题描述】:

我正在使用a 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

【问题讨论】:

    标签: ruby-on-rails ruby api http


    【解决方案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=。

    【讨论】:

    • 谢谢。我已经分叉了宝石以使其工作。所以我想我应该降低延迟并提高尝试?我想知道是否有更好的方法来知道何时放弃。
    • 我认为重试频率超过每 3 秒一次是没有意义的。我什至会增加它。只有您可以决定等待结果的时间。此代码是同步的,它会阻塞直到指定超时。如果您从某个后台任务的 ruby​​ 脚本运行此代码 - 您可能会等待很长时间。比如3-5分钟。但是,如果代码作为处理真实用户 http 请求的一部分运行,您通常根本不想等待。甚至1秒也太多了。所以用服务端push或者ajax long-poll来实现一些异步检查是正确的。
    • 它是一个 ajax 请求,但用户将等待结果。理想情况下,我想在几秒钟内把它交给他们,但迟到总比给出“超时错误”要好。不知道避免错误的最佳方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 2015-04-18
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多