2013-07-29 41 views
0

我使用a gem从Ideone.com获取代码结果。 gem将代码提交给Ideone,然后检查结果页面。它检查timeout次,然后放弃,如果没有结果。问题是它可能会放弃得太早,但如果不会有结果,我也不希望它太久。有没有办法知道什么时候该放弃希望?何时放弃从外部Web服务获取结果?

这是相关代码:

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 

回答

1

听起来像是你要调整的尝试参数睡眠超时和数量。没有适合每种情况的绝对值,所以您应该选择一些最适合您的应用程序。

不幸的是,宝石代码有这个参数(3秒延迟和4次尝试)硬编码,所以你没有一个优雅的方式来改变它们。因此,您可以分叉宝石并更改其代码,或者尝试使用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 =。

+0

谢谢。我已经把宝石分出来让它工作。所以我想我应该降低延迟并提高尝试次数?我想知道是否有更好的方法知道什么时候放弃。 – Ari

+0

我认为每3秒更频繁地重试一次是没有意义的。我甚至会增加它。 只有您可以决定可以等待多久的结果。 这段代码是同步的,它会阻塞直到超时指定。 如果您从某个后台任务的ruby脚本运行此代码 - 您可以等待相当长的时间。像3-5分钟。 但是,如果代码是作为处理真实用户http请求的一部分运行的,那么您通常不希望等待。即使1秒也是太多。因此,使用服务器端推送或ajax长轮询来实现一些异步检查是正确的。 – cryo28

+0

它是一个ajax请求,但用户将等待结果。理想情况下,我想在几秒钟内给他们,但最好迟到,而不是“超时错误”。不知道最好的方法来避免错误。 – Ari