Задержка метода, основанного на результатах страницы

#ruby-on-rails #ruby

#ruby-on-rails #ruby

Вопрос:

Я извлекаю результаты из онлайн-инструмента NCBI Blast с помощью «net / http» и «uri». Для этого мне нужно выполнить поиск по HTML-странице, чтобы проверить, является ли одна из строк «Статус = ОЖИДАНИЕ» или «Статус = ГОТОВНОСТЬ». Когда инструмент 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. Не видя HTML, трудно сказать, но я подозреваю, что вы могли бы немного упростить свой поиск, используя поиск по тексту в строке. Кроме того, для любых задач, кроме самых тривиальных, синтаксический анализатор избавит вас от многих хлопот в долгосрочной перспективе. Я рекомендую Nokogiri. Кроме того, посмотрите на использование встроенного в Ruby Open::URI . Это намного проще в использовании по сравнению с Net::HTTP и URI .

2. Кроме того, ваш "#{rid}" можно упростить до rid или, rid.to_s если rid это еще не строка.

Ответ №1:

Взгляните на эту реализацию. Это то, что он делает:

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

Я думаю, что использование сканера строк может быть немного более эффективным, чем перебор каждой строки на странице, но я не смотрел на его реализацию, поэтому я могу ошибаться.

Комментарии:

1. Не могли бы вы объяснить мне @logger.debug(«Статус = Ожидание»). Я не знаком с этим.

2. Это просто выводится Status=WAITING на консоль ruby. Смотрите это .