Почему EventMachine, задерживают медленнее, чем Поток Ruby?

У меня есть два сценария, какое использование Механизируют для выборки индексной страницы 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
10
задан the Tin Man 1 August 2013 в 22:15
поделиться

2 ответа

Ага, вы неправильно его используете. EventMachine работает, выполняя асинхронные вызовы ввода-вывода, которые немедленно возвращаются и уведомляют «реактор» (цикл событий, запущенный EM.run), когда они завершены. У вас есть два блокирующих вызова, которые нарушают цель системы: sleep и Mechanize.get. Вы должны использовать специальные асинхронные / неблокирующие библиотеки для получения любого значения из EventMachine.

9
ответ дан 3 December 2019 в 13:44
поделиться

Вы должны использовать что-то вроде em-http-request http://github.com/igrigorik/em-http-request

7
ответ дан 3 December 2019 в 13:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: