2017-07-20 34 views

回答

1

Node和libuv的I/O模型與nginx在內部非常相似。

libuv使用單線程事件循環和非阻塞異步I/O。所有的函數都以同步的方式運行到完成,但是一些帶有promise和generator的巧妙hackery可以用來表示它們不會(事實上,生成器函數的調用都是非阻塞的並返回生成器對象立即和生成器方法如.next()運行完成),再加上新的異步/等待語法使其非常方便。

對於無法以非阻塞方式完成的操作節點使用線程池在單獨的線程中運行阻塞操作,但這是透明地完成的,它永遠不會暴露給用JavaScript編寫的應用程序代碼(您需要下一步到C++直接使用)。

參見:http://docs.libuv.org/en/v1.x/design.html

與網絡I/O,沒有特定於平臺的文件I/O原語libuv可以依靠,所以目前的辦法是運行阻止文件I/O的操作線程池。 [...]

libuv當前使用全局線程池,所有循環都可以在其上進行隊列工作。 3種類型的操作是當前在該池運行:

  • 文件系統操作
  • DNS函數(的getaddrinfo和getnameinfo)經由uv_queue_work
  • 用戶指定的代碼()

參見那些答案的更多細節:

見這些答案的鏈接和說明。有很多資源可以閱讀這個話題。

+0

這些都是很好的參考,但沒有一個具體討論這個問題。讓我問一個更具體的問題。由於所有網絡io都在libuv中的單個線程上運行,爲了實現具有某些事件讀取事件的異步io,您必須爲該操作系統委派任務,併爲其提供一個用戶定義的緩衝區,該緩衝區將填充來自閱讀op,但那將是proactor模式。 libuv如何通過使用單線程反應器事件循環實現類似的效果? – Michael

+0

@Michael大多數網絡I/O在單個天線上運行,但例如而不是DNS操作(getaddrinfo和getnameinfo)而不是文件系統I/O,所以這不像看起來那麼清晰,並且沒有任何單一的理論模式可以100%應用於Node需要的所有邊緣情況支持所有平臺。 – rsp

+0

@Michael我在答案中列出的第一個答案有一些評論,你可能會發現[** saghul **]發佈的有用評論(https://stackoverflow.com/users/280310/saghul?tab=topactivity )(我想這個人會給你一個更詳細的答案給你的評論,但不幸的是,只能在註釋中註明某人回答他已經評論過的地方)。 – rsp