Я делаю веб-приложение с интенсивным использованием данных, которое пытаюсь оптимизировать. Я слышал о разветвлении и потоке, но не знаю, применимы ли они к тому, что я пытаюсь сделать, и если да, то как их реализовать. Мой код выглядит так:
def search
@amazon_data=Hash.from_xml(item.retrieve_amazon(params[:sku]))
unless @amazon_data['results'] == nil
@amazon_data['results']['item'].size.times do |i|
@all_books << { :vendor => 'Amazon.com',
:price => @amazon_data['results']['item'][i]['price'].to_f,
:shipping => @amazon_data['results']['item'][i]['ship'].to_f,
:condition => @amazon_data['results']['item'][i]['condition'],
:total => @amazon_data['results']['item'][i]['price'].to_f + @amazon_data['results']['item'][i]['ship'].to_f,
:availability => 'In Stock',
:link_text => 'Go to Amazon.com',
:link_url => "http://www.amazon.com/gp/offer-listing/#{params[:isbn]}"
}
end
end
@ebay_data=Hash.from_xml(Book.retrieve_ebay(params[:sku]))
unless @ebay_data['results'] == nil
@ebay_data['results']['item'].size.times do |i|
@all_books << { :vendor => 'eBay',
:price => @ebay_data['results']['item'][i]['price'].to_f,
:shipping => @ebay_data['results']['item'][i]['ship'].to_f,
:condition => 'Used',
:total => @ebay_data['results']['item'][i]['price'].to_f + @ebay_data['results']['item'][i]['ship'].to_f,
:availability => 'In Stock',
:link_text => 'Go to eBay',
:link_url => "http://www.amazon.com/gp/offer-listing/#{params[:sku]}"
}
end
end
end
Итак, в основном у меня есть два действия, которые извлекают данные из eBay и Amazon и анализируют их здесь. Как я могу заставить оба этих действия выполняться одновременно? Есть ли какое-либо отношение между форком или нитью к тому, чего я пытаюсь достичь?
Это сокращает время API в два раза, но я не знаю, как вернуть результаты. Последующее представление загружается до того, как возвращаются результаты API .... Однако данные возвращаются. Когда я кодирую в
puts @all_books
в результатах темы отображаются в консоли. Однако за пределами потока результаты не возвращаются.
def search
Thread.new do
@amazon_data=Hash.from_xml(item.retrieve_amazon(params[:sku]))
unless @amazon_data['results'] == nil
@amazon_data['results']['item'].size.times do |i|
@all_books << { :vendor => 'Amazon.com',
:price => @amazon_data['results']['item'][i]['price'].to_f,
:shipping => @amazon_data['results']['item'][i]['ship'].to_f,
:condition => @amazon_data['results']['item'][i]['condition'],
:total => @amazon_data['results']['item'][i]['price'].to_f + @amazon_data['results']['item'][i]['ship'].to_f,
:availability => 'In Stock',
:link_text => 'Go to Amazon.com',
:link_url => "http://www.amazon.com/gp/offer-listing/#{params[:isbn]}"
}
end
end
end
Thread.new do
@ebay_data=Hash.from_xml(Book.retrieve_ebay(params[:sku]))
unless @ebay_data['results'] == nil
@ebay_data['results']['item'].size.times do |i|
@all_books << { :vendor => 'eBay',
:price => @ebay_data['results']['item'][i]['price'].to_f,
:shipping => @ebay_data['results']['item'][i]['ship'].to_f,
:condition => 'Used',
:total => @ebay_data['results']['item'][i]['price'].to_f + @ebay_data['results']['item'][i]['ship'].to_f,
:availability => 'In Stock',
:link_text => 'Go to eBay',
:link_url => "http://www.amazon.com/gp/offer-listing/#{params[:sku]}"
}
end
end
end
end
Я на правильном пути? Как я могу вернуть результаты из потока? Это то, что переменная доступна только в потоке, или проблема заключается в том, что программа прогрессирует до того, как результаты будут возвращены?
К сожалению, приложению требуется ввод данных в реальном времени для запроса API. Возвращенные данные должны быть свежими, как это связано с ценообразованием продукта на торговых площадках ... Например, пользователь вводит SKU, и с этой информацией программа делает запрос на соответствующие сайты (в данном случае Amazon и eBay). .) В настоящее время он отправляет запрос в Amazon, анализирует данные, форматирует их, а затем переходит на eBay, анализирует данные и форматирует их. Затем отформатированные данные отображаются в виде.
Я подумал, что если бы я мог выполнять эти вызовы API одновременно (в разных потоках?), Это сэкономило бы время на конце веб-обслуживания, поскольку все, что требовалось бы, - это проанализировать возвращенные данные и правильно отформатировать их. (Что я также мог бы ускорить ...)