Каков предпочтительный способ выполнения неблокирующих операций ввода-вывода в Ruby? - PullRequest
8 голосов
/ 17 декабря 2010

Если, скажем, я хочу получить веб-страницу для анализа, но не блокировать процессор во время ввода-вывода. Есть ли что-то эквивалентное библиотеке Eventlet в Python?

Ответы [ 2 ]

17 голосов
/ 17 декабря 2010

Лучшая клиентская библиотека HTTP для Ruby - Typhoeus , ее можно использовать для параллельного выполнения нескольких HTTP-запросов неблокирующим образом.Существует блокирующий и неблокирующий интерфейс:

# blocking
response = Typhoeus::Request.get("http://stackoverflow.com/")
puts response.body

# non-blocking
request1 = Typhoeus::Request.new("http://stackoverflow.com/")
request1.on_complete do |response|
  puts response.body
end
request2 = Typhoeus::Request.new("http://stackoverflow.com/questions")
request2.on_complete do |response|
  puts response.body
end
hydra = Typhoeus::Hydra.new
hydra.queue(request1)
hydra.queue(request2)
hydra.run # this call is blocking, though

Другой вариант - em-http-request , который выполняется поверх EventMachine.Он имеет полностью неблокирующий интерфейс:

EventMachine.run do
  request = EventMachine::HttpRequest.new('http://stackoverflow.com/').get
  request.callback do
    puts request.response
    EventMachine.stop
  end
end

Также имеется интерфейс для параллельного выполнения многих запросов, аналогично Typhoeus Hydra.

Недостатком em-http-request являетсяэто связано с EventMachine.EventMachine сам по себе является потрясающей платформой, но это сделка «все или ничего».Вам нужно написать все приложение в стиле выравнивания / прохождения продолжения, и это, как известно, вызывает повреждение мозга.Typhoeus гораздо лучше подходит для приложений, которые еще не выровнены.

5 голосов
/ 17 декабря 2010

Я не уверен, что делает Eventlet, но в Ruby есть EventMachine , библиотека для неблокирующего ввода / вывода ( среди прочего ).

...