У меня есть два сценария, какое использование Механизируют для выборки индексной страницы Google. Я предположил, что EventMachine будет быстрее, чем поток Ruby, но это не.
EventMachine кодируют затраты: "0.24s user 0.08s system 2% cpu 12.682 total"
Поток Ruby кодирует затраты: "0.22s user 0.08s system 5% cpu 5.167 total "
Я использую EventMachine неправильным способом?
EventMachine:
require 'rubygems'
require 'mechanize'
require 'eventmachine'
trap("INT") {EM.stop}
EM.run do
num = 0
operation = proc {
agent = Mechanize.new
sleep 1
agent.get("http://google.com").body.to_s.size
}
callback = proc { |result|
sleep 1
puts result
num+=1
EM.stop if num == 9
}
10.times do
EventMachine.defer operation, callback
end
end
Поток Ruby:
require 'rubygems'
require 'mechanize'
threads = []
10.times do
threads << Thread.new do
agent = Mechanize.new
sleep 1
puts agent.get("http://google.com").body.to_s.size
sleep 1
end
end
threads.each do |aThread|
aThread.join
end
Ага, вы неправильно его используете. EventMachine работает, выполняя асинхронные вызовы ввода-вывода, которые немедленно возвращаются и уведомляют «реактор» (цикл событий, запущенный EM.run), когда они завершены. У вас есть два блокирующих вызова, которые нарушают цель системы: sleep и Mechanize.get. Вы должны использовать специальные асинхронные / неблокирующие библиотеки для получения любого значения из EventMachine.
Вы должны использовать что-то вроде em-http-request http://github.com/igrigorik/em-http-request