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