根据页面结果延迟方法

时间:2011-06-03 16:12:33

标签: ruby-on-rails ruby

我正在使用'net / http'和'uri'从NCBI的在线Blast工具中检索结果。为此,我必须搜索html页面以检查其中一行是“Status = WAITING”还是“Status = READY”。当Blast工具完成后,状态将变为ready并且结果将发布在html页面上。

我有一个工作版本来检查状态,然后检索我需要的信息,但效率很低,当我相信可以通过某种方式将它们合二为一时,它会被分解为两种方法。

def waitForBlast(rid)
    get = Net::HTTP.post_form(URI.parse('http://www.ncbi.nlm.nih.gov/blast/Blast.cgi?'), {:RID => "#{rid}", :CMD => 'Get'})
    get.body.each{|line| (waitForBlast(rid) if line.strip == "Status=WAITING") if line[/Status=/]}
end

def returnBlast(rid)
    blast_array = Array.new
    get = Net::HTTP.post_form(URI.parse('http://www.ncbi.nlm.nih.gov/blast/Blast.cgi?'), {:RID => "#{rid}", :CMD => 'Get'})
    get.body.each{|line| blast_array.push(line[/<a href=#\d+>/][/\d+/]) if line[/<a href=#\d+>/]}
    return blast_array
end

第一种方法检查状态并且是我主要担心的,因为它是递归的。我相信(并纠正我,如果我错了)设计为需要太多的计算能力,当我需要的是在同一方法中重新检查结果的某种方式(添加时间延迟是一个奖励)。第二种方法很好,但我更喜欢它是否与第一种方法结合起来。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

查看this实施情况。这就是他的所作所为:

 res='http://www.ncbi.nlm.nih.gov/blast/Blast.cgi?CMD=Get&FORMAT_OBJECT=SearchInfo&RID=' + @rid
 while status = open(res).read.scan(/Status=(.*?)$/).to_s=='WAITING'
   @logger.debug("Status=WAITING")
   sleep(3)
 end   

我认为使用字符串扫描程序可能比迭代页面中的每一行更有效,但我没有看过它的实现,所以我可能错了。