我知道纖維是合作的線程。光纖具有對執行上下文的控制權,而搶先式線程不具有控制權。光纖可以產生控制,這意味着光纖可以在明確的位置開始和停止。紅寶石纖維程序控制流程
很明顯,爲什麼纖維用於均勻的紅寶石的原因是清理由反應堆模式引起的嵌套塊。
但是我很難掌握下面使用光纖的腳本的控制流。
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)被創建的纖維,然後將恢復被調用。傳遞給新獲得的代碼塊是否立即執行,或者是否在調用簡歷後執行?
3)http_get被稱爲第一次。它執行一個異步事件(在linux上使用select,poll或epoll)。我們設置異步事件的事件處理程序(在回調方法中)。然後光纖自動控制線程EventMachine(主線程)。但是,只要調用回調函數,它將使用f.resume(http)進行控制。但在這個簡化的例子中,我應該在f.resume(http)之後放置自己的回調代碼嗎?因爲現在看起來好像f.resume(http)只是將控制權交還給光纖,並且什麼都不做。
我想在yield之後會發生什麼,控件會進入EventMachine並進入事件循環。所以第二個http_get沒有被調用。現在一旦回調被調用,控制就返回到光纖(我們只使用一個Fiber.new,所以我假設在這一切中只有一個光纖實例)。但是第二個http_get何時被調用?
自我注意:創建光纖時,它不會自動運行。相反,必須明確要求使用光纖#恢復方法運行。 – Donato