У меня есть приложение Sinatra с длительным процессом (веб-скребок). Я хотел бы сброс приложения результаты прогресса поискового робота, когда поисковый робот работает вместо в конце.
Я полагал, что разветвление запроса и выполнение чего-то полагают с ajax, но это - действительно основное приложение одностраничного документа, которое действительно просто должно произвести журнал к браузеру, как это происходит. Какие-либо предложения?
Начиная с Sinatra 1.3.0, вы можете использовать новый потоковый API :
get '/' do
stream do |out|
out << "foo\n"
sleep 10
out << "bar\n"
end
end
К сожалению, у вас нет потока, в который вы можете просто выполнить сброс (это не будет работать с промежуточным программным обеспечением Rack). Результат, возвращенный из блока маршрута, может просто отвечать на каждый
. Затем обработчик стойки вызовет каждый
с блоком и в этом блоке передаст клиенту заданную часть тела.
Все ответы стойки должны всегда отвечать на каждый
и всегда передавать строки заданному блоку. Sinatra позаботится об этом за вас, если вы просто вернете строку.
Простой пример потоковой передачи:
require 'sinatra'
get '/' do
result = ["this", " takes", " some", " time"]
class << result
def each
super do |str|
yield str
sleep 0.3
end
end
end
result
end
Теперь вы можете просто поместить все сканирование в метод each
:
require 'sinatra'
class Crawler
def initialize(url)
@url = url
end
def each
yield "opening url\n"
result = open @url
yield "seaching for foo\n"
if result.include? "foo"
yield "found it\n"
else
yield "not there, sorry\n"
end
end
end
get '/' do
Crawler.new 'http://mysite'
end