libuv用于处理IO的reactor模式是设计同步的,但libuv支持async io。这怎么可能? libuv是否以某种方式扩展了反应堆的设计以支持异步io?使用多线程/事件循环有助于实现这一目标吗?
答案 0 :(得分:1)
Node和libuv的I / O模型与nginx内部的工作非常相似。
libuv使用单线程事件循环和非阻塞异步I / O.所有函数都以它们运行完成的方式同步,但是使用promises和generator的一些聪明的hackery可以用来表示它们不会(实际上,生成器函数的调用都是非阻塞的并返回立即生成对象,像.next()
这样的生成器方法运行完成),加上新的async / await语法使它非常方便。
对于无法以非阻塞方式完成的操作,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()
有关详细信息,请参阅这些答案:
请参阅这些答案中的链接和插图。有很多资源可以阅读该主题。