나는 섬유가 협동 스레드라는 것을 알고있다. 선점 스레드는 그렇지 않지만 파이버는 실행 컨텍스트를 제어합니다. 광섬유는 제어가 가능하므로 광섬유가 잘 정의 된 위치에서 시작하고 중지 할 수 있습니다.루비 섬유 프로그램의 제어 흐름
분명히 루비에서 섬유가 사용되는 이유는 원자로 패턴으로 인해 발생하는 중첩 된 블록을 정리하는 것입니다.
하지만 섬유를 사용하는 아래 스크립트의 제어 흐름을 파악하는 데 어려움이 있습니다.
는def http_get(url)
f = Fiber.current
http = EventMachine::HttpRequest.new(url).get
# resume fiber once http call is done
http.callback { f.resume(http) }
http.errback { f.resume(http) }
return Fiber.yield
end
EventMachine.run do
Fiber.new{
page = http_get('http://www.google.com/')
puts "Fetched page: #{page.response_header.status}"
if page
page = http_get('http://www.google.com/search?q=eventmachine')
puts "Fetched page 2: #{page.response_header.status}"
end
}.resume
end
내가 알고있는 방법은 :
1) EM은 이벤트 루프
2) 섬유가 만들어 시작 후 이력서가 호출됩니다. new에 전달 된 코드 블록이 즉시 실행되거나 이력서가 호출 된 후에 실행됩니까?
3) http_get이 처음으로 호출되었습니다. 비동기 이벤트 (리눅스에서 select, poll 또는 epoll 사용). 비동기 이벤트의 이벤트 핸들러 (콜백 메소드에 있음)를 설정합니다. 그런 다음 Fiber가 자발적으로 EventMachine 스레드 (메인 스레드)에 대한 제어권을 부여합니다. 그러나 콜백이 호출되자 마자 f.resume (http)을 사용하여 다시 제어 할 수 있습니다. 그러나이 간단한 예제에서는 f.resume (http) 뒤에 내 자신의 콜백 코드를 넣어야하겠습니까? 왜냐하면 지금은 f.resume (http)가 광섬유에 제어권을 반환하고 다른 작업을 수행하지 않기 때문입니다.
수확 후 컨트롤이 이벤트 루프로 들어가는 EventMachine으로 이동한다고 생각합니다. 따라서 두 번째 http_get은 아직 호출되지 않습니다. 일단 콜백이 호출되면, 파이버에 컨트롤이 반환됩니다 (우리는 하나의 Fiber.new 만 사용하기 때문에이 모든 경우에 파이버 인스턴스가 하나만 있다고 가정합니다). 하지만 두 번째 http_get이 언제 호출됩니까?
참고 사항 : 광섬유가 생성되면 자동으로 실행되지 않습니다. 오히려 명시 적으로 Fiber # resume 메소드를 사용하여 실행하도록 요청해야합니다. – Donato