구문 분석 할 웹 페이지를 검색하려고하지만 입출력이 진행되는 동안 CPU를 차단하지 않겠다고 말한 경우 파이썬의 이벤트 릿 라이브러리와 동일한 것이 있습니까?Ruby에서 블로킹 I/O를 수행하는 기본 방법은 무엇입니까?
8
A
답변
5
나는 Eventlet이 무엇인지 모르지만 루비는 논 블로킹 IO (amongst other things)를위한 라이브러리 인 EventMachine을 가지고있다.
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. 장치에 넌 블로킹 쓰기를 수행하는 방법은 무엇입니까?
- 2. VBS에서 논 블로킹 IO를 수행하는 방법이나 COM 이벤트와 함께 신호를 보낼 수있는 방법이 있습니까?
- 3. Windows에서 비동기식 io를 이해하는 방법은 무엇입니까?
- 4. Ruby에서 Fixnum의 기본 10 로그를 얻는 방법은 무엇입니까?
- 5. Haskell에서 기능 감시에서 IO를 수행하는 방법이 있습니까? 예를 들어
- 6. 스칼라에서 비 블로킹 방법을 만드는 방법은 무엇입니까?
- 7. 블로킹/동기 방식으로 파일을 다운로드하는 방법은 무엇입니까?
- 8. NIO와 IO를 섞기
- 9. Ruby에서 배열을 채우는 방법은 무엇입니까?
- 10. Ruby에서 MD5를 해독하는 방법은 무엇입니까?
- 11. Ruby에서 목록을 만드는 방법은 무엇입니까?
- 12. Ruby에서 해시를 반복하는 방법은 무엇입니까?
- 13. Ruby에서 무한대를 표현하는 방법은 무엇입니까?
- 14. Ruby에서 STDIN과 $ stdin의 차이점은 무엇입니까?
- 15. Apache에서이를 수행하는 방법은 무엇입니까?
- 16. 시각적 기본 배열에서 값 보간을 수행하는 방법은 무엇입니까?
- 17. iPhone에서 기본 2D 이미지 애니메이션을 수행하는 가장 좋은 방법은 무엇입니까?
- 18. 웹 서비스를 사용하여 기본 앱에서 인증을 수행하는 방법은 무엇입니까?
- 19. 봄 보안을 사용하여 빈 암호로 기본 인증을 수행하는 방법은 무엇입니까?
- 20. Wicket에서 사이트 서식 파일과 테마를 수행하는 기본 방법은 무엇입니까?
- 21. WCF 데이터 서비스에서이 작업을 수행하는 기본 방법은 무엇입니까
- 22. UIGestureRecognizer 블로킹 테이블 뷰 블로킹
- 23. 블로킹 콜렉션의 기본 기본 동시 큐에 액세스하는 방법
- 24. Eclipse에 Apache Commons IO를 포함시키는 방법은 무엇입니까? (Java)
- 25. Ruby에서 for-loop를 정의하는 방법은 무엇입니까?
- 26. Python 3 : 객체가 IO를 지원하는지 확인
- 27. Perl 논 블로킹 소켓
- 28. 하스켈에서 IO를 조건부로 처리하는 관용적 인 방법
- 29. Haskell이 원자 IO를 수행하도록 할 수 있습니까?
- 30. Java NIO/선택기를 사용하여 읽기 타임 아웃을 수행하는 방법은 무엇입니까?
hydra.run 호출이 블로킹 중이라고 말하면, 슬립 상태로 남아 있고 입출력이 완료되면 깨어납니다. 이것은 Windows에서 이벤트 구동 I/O와 같이 내가 달성하고자하는 것입니다. hydra.run 호출이 수행되는 스레드가 차단 되더라도 CPU를 사용하지 않아야합니다. 본질적으로 이벤트를 기다리고 있기 때문입니다. 그게 히드라가 작동하는 방법인가요? 그렇지 않다면, 나는 그것을 일종의 목적에 어긋나게 생각합니다. 당신이 확인할 수 있다면, 나는 이것을 인정 된 것으로 표시 할 것입니다. 감사. –
그것이 작동하는 방법입니다. 바쁜 대기는 계속 진행되지 않습니다. – Theo
제 경우에는 현재 스레드를 해제하고 전혀 차단하지 않아야합니다. 'hydra.run'호출을 차단하는 방법이 있습니까? 완전히 비 차단 방식을 지원하는 다른 HTTP 루비 보석이 있습니까? –