node.js / libuv如何使用reactor模式支持async io

时间:2017-07-20 10:58:54

标签: node.js asynchronous io libuv reactor

libuv用于处理IO的reactor模式是设计同步的,但libuv支持async io。这怎么可能? libuv是否以某种方式扩展了反应堆的设计以支持异步io?使用多线程/事件循环有助于实现这一目标吗?

1 个答案:

答案 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()
  •   

有关详细信息,请参阅这些答案:

请参阅这些答案中的链接和插图。有很多资源可以阅读该主题。