libuv用於處理IO的反應堆模式是按設計同步的,但libuv支持異步io。這怎麼可能? libuv是否以某種方式擴展了反應堆的設計以支持異步io?使用多線程/事件循環是否有助於實現這一目標?node.js/libuv如何使用反應堆模式支持異步io
1
A
回答
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
- 用戶指定的代碼()
參見那些答案的更多細節:
- what is mean by event loop in node.js ? javascript event loop or libuv event loop? * NodeJS event loop internal working
- Prevent NodeJS from exiting event-loop
- How node.js server serve next request, if current request have huge computation?
- Which would be better for concurrent tasks on node.js? Fibers? Web-workers? or Threads?
- Speed up setInterval
- Async.js - Is parallel really parallel?
- Node.js: Asynchronous Callback Execution. Is this Zalgo?
見這些答案的鏈接和說明。有很多資源可以閱讀這個話題。
相關問題
- 1. 如何使LogbackValve異步支持?
- 2. 使用CFWriteStream的異步IO
- 3. Spring異步調用支持?
- 4. Ansible:服務模塊不支持異步模式
- 5. 如何使用不支持異步的庫?
- 6. ServiceStack.Redis缺少異步支持
- 7. FacesServlet Servlet 3.0異步支持
- 8. 異步/等待nodejs支持?
- 9. Java Servlet異步支持
- 10. Telerik中基於任務的異步模式支持
- 11. 如何反彈使用異步/等待?
- 12. MobX異步反應
- 13. 支持或不支持monodroid支持異步?
- 14. 設計使用同時支持同步和異步調用
- 15. 異步IO與CFReadStream
- 16. 使用stdio.h異步緩衝io?
- 17. 如何啓用請求異步模式?
- 18. PHP是否支持異步調用?
- 19. 如何使用Task.Run如果使用庫不支持異步等待
- 20. NodeJS如何處理異步文件IO?
- 21. 如何理解Windows中的異步io?
- 22. 如何使用反應16功能,而不需要支持反應15
- 23. 如何在PHP中使用異步IO(用於IRC客戶端)?
- 24. 如何輕鬆支持重複的異步/同步方法?
- 25. 「反應堆模式」的說明
- 26. 異步調用和異步io調用之間的差異.net
- 27. 使用反應式擴展重試異步任務代碼
- 28. 如何將異步設計模式轉換爲同步模式?
- 29. 如何在Boost Spirit中使用非阻塞或異步IO?
- 30. 在Spring CLI中使用Java進行異步IO處理如何?
這些都是很好的參考,但沒有一個具體討論這個問題。讓我問一個更具體的問題。由於所有網絡io都在libuv中的單個線程上運行,爲了實現具有某些事件讀取事件的異步io,您必須爲該操作系統委派任務,併爲其提供一個用戶定義的緩衝區,該緩衝區將填充來自閱讀op,但那將是proactor模式。 libuv如何通過使用單線程反應器事件循環實現類似的效果? – Michael
@Michael大多數網絡I/O在單個天線上運行,但例如而不是DNS操作(getaddrinfo和getnameinfo)而不是文件系統I/O,所以這不像看起來那麼清晰,並且沒有任何單一的理論模式可以100%應用於Node需要的所有邊緣情況支持所有平臺。 – rsp
@Michael我在答案中列出的第一個答案有一些評論,你可能會發現[** saghul **]發佈的有用評論(https://stackoverflow.com/users/280310/saghul?tab=topactivity )(我想這個人會給你一個更詳細的答案給你的評論,但不幸的是,只能在註釋中註明某人回答他已經評論過的地方)。 – rsp