【发布时间】:2017-12-26 00:52:15
【问题描述】:
libuv 用于处理 IO 的反应器模式在设计上是同步的,但 libuv 支持异步 io。这怎么可能? libuv 是否以某种方式扩展了反应器的设计以支持异步 io?使用多个线程/事件循环是否有助于实现这一点?
【问题讨论】:
标签: node.js asynchronous io libuv reactor
libuv 用于处理 IO 的反应器模式在设计上是同步的,但 libuv 支持异步 io。这怎么可能? libuv 是否以某种方式扩展了反应器的设计以支持异步 io?使用多个线程/事件循环是否有助于实现这一点?
【问题讨论】:
标签: node.js asynchronous io libuv reactor
Node 和 libuv 的 I/O 模型和 Nginx 内部做的非常相似。
libuv 使用单线程事件循环和非阻塞异步 I/O。所有函数都是同步的,它们会运行到完成,但是可以使用一些聪明的 promises 和 generators 来表现它们不同步(事实上,生成器函数的调用都是非阻塞的并返回生成器对象立即和像.next()这样的生成器方法运行完成),加上新的异步/等待语法使其非常方便。
对于无法以非阻塞方式完成的操作,Node 使用线程池在单独的线程中运行阻塞操作,但这是透明地完成的,它永远不会暴露给用 JavaScript 编写的应用程序代码(您需要逐步直到 C++ 直接使用它)。
见:http://docs.libuv.org/en/v1.x/design.html
与网络 I/O 不同,libuv 没有可以依赖的特定于平台的文件 I/O 原语,因此当前的方法是在线程池中运行阻塞文件 I/O 操作。 [...]
libuv 当前使用一个全局线程池,所有循环都可以在其中排队工作。目前在此池上运行 3 种类型的操作:
- 文件系统操作
- DNS 函数(getaddrinfo 和 getnameinfo)
- 用户通过 uv_queue_work() 指定代码
有关更多详细信息,另请参阅这些答案:
请参阅这些答案中的链接和插图。有很多关于该主题的资源可供阅读。
【讨论】: