如果說我想檢索一個網頁進行解析,但不會在發生I/O時阻塞CPU。有沒有相當於Python的Eventlet庫的東西?在Ruby中執行非阻塞I/O的首選方式是什麼?
8
A
回答
5
我不確定Eventlet是做什麼的,但Ruby有EventMachine,一個用於非阻塞IO的庫(amongst other things)。
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. 什麼是簡單的話阻止IO和非阻塞IO?
- 2. 使用Ruby的非阻塞IO?
- 3. 非阻塞方式
- 4. BlockingQueue阻塞的方式是什麼?
- 5. .net非阻塞IO pre 4.5
- 6. IOCP和非阻塞IO
- 7. 非阻塞IO和HystrixObservableCommand
- 8. Scala中的非阻塞和阻塞未來是什麼?
- 9. 什麼是使對象的非阻塞版本的Pythonic方式?
- 10. 爲什麼select()始終在非阻塞模式下被阻塞
- 11. 非阻塞方式的Kombu
- 12. 瞭解節點中的非阻塞IO
- 13. 如何將Scala中的阻塞IO封裝爲非阻塞
- 14. Python中的阻塞與非阻塞網絡IO
- 15. Ruby中的緩衝/ RingBuffer IO + Amazon S3非阻塞區塊讀取
- 16. Verilog中的非阻塞語句執行
- 17. java中的阻塞模式是什麼
- 18. PHP Inotify非阻塞方式
- 19. 非阻塞IO Java中與邏輯
- 20. 爲什麼concurrent_queue非阻塞?
- 21. 同步方法執行時,非同步方法是否阻塞
- 22. 什麼是非阻塞信號量?
- 23. 什麼是非阻塞生成器
- 24. 阻止IO與非阻塞IO;尋找好的文章
- 25. MSMQ:以非阻塞方式讀取隊列的最佳方式是什麼?
- 26. load_balanced_mode()中的IPython.parallel中的阻塞和非阻塞模式有什麼區別?
- 27. 執行非阻塞EVAL MongoDB中
- 28. 在閃存中是否存在非阻塞io?
- 29. Winsock的非阻塞IO重疊仍塊
- 30. 的Java非阻塞IO CPU泄漏
當你說hydra.run的調用被阻塞時,這很好,只要它保持睡眠狀態,並在I/O完成時喚醒。這就是我期望實現的,就像在Windows中使用事件驅動的I/O一樣。不管是什麼線程,hydra.run調用都應該在阻塞時不採用CPU,因爲它基本上等待着一個事件。這是怎麼九頭蛇的作品?如果不是的話,我認爲這有點違背了目的。如果您可以確認,我會將其標記爲已接受。謝謝。 – 2010-12-20 04:28:50
這就是它的工作原理,沒有忙着等待。 – Theo 2010-12-20 08:01:54
在我的情況下,我需要釋放當前線程而不是阻塞。有沒有辦法避免阻塞'hydra.run'的呼叫?有沒有其他的HTTP ruby支持完全非阻塞的方法? – 2014-11-21 19:15:23