2010-12-17 26 views

回答

17

Ruby的最佳HTTP客戶端庫是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更適合於尚未完成的應用。

+1

當你說hydra.run的調用被阻塞時,這很好,只要它保持睡眠狀態,並在I/O完成時喚醒。這就是我期望實現的,就像在Windows中使用事件驅動的I/O一樣。不管是什麼線程,hydra.run調用都應該在阻塞時不採用CPU,因爲它基本上等待着一個事件。這是怎麼九頭蛇的作品?如果不是的話,我認爲這有點違背了目的。如果您可以確認,我會將其標記爲已接受。謝謝。 – 2010-12-20 04:28:50

+1

這就是它的工作原理,沒有忙着等待。 – Theo 2010-12-20 08:01:54

+0

在我的情況下,我需要釋放當前線程而不是阻塞。有沒有辦法避免阻塞'hydra.run'的呼叫?有沒有其他的HTTP ruby​​支持完全非阻塞的方法? – 2014-11-21 19:15:23