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

libuv用于处理IO的反应器模式是通过devise同步的,但是libuv支持asynchronousIO。 这怎么可能? libuv是否扩展了反应堆的devise以支持asynchronousio? 使用multithreading/事件循环是否有助于实现这一点?

Node和libuv的I / O模型与nginx在内部非常相似。

libuv使用单线程事件循环和非阻塞asynchronousI / O。 所有的函数都是以同步的方式运行到完成的,但是一些带有promise和generator的巧妙hackery可以被用来表示它们不会(事实上,生成器函数的调用都是非阻塞的并且返回生成器对象立即和生成器方法如.next()运行到完成),再加上新的asynchronous/等待语法使得它非常方便。

对于无法以非阻塞方式完成的操作,节点使用线程池在单独的线程中运行阻塞操作,但是这是透明地完成的,并且不会暴露给使用JavaScript编写的应用程序代码(您需要下到C ++直接使用)。

请参阅: http : //docs.libuv.org/en/v1.x/design.html

与networkingI / O不同,没有libuv可以依赖的特定于平台的文件I / O原语,因此当前的方法是在线程池中运行阻塞文件I / O操作。 […]

libuv当前使用全局线程池,所有循环都可以在其上进行排队。 目前在这个池上运行3种types的操作:

  • 文件系统操作
  • DNSfunction(getaddrinfo和getnameinfo)
  • 用户指定的代码通过uv_queue_work()

另请参阅这些答案的更多细节:

  • node.js中的事件循环是什么意思? javascript事件循环或libuv事件循环? * NodeJS事件循环内部工作
  • 防止NodeJS退出事件循环
  • Node.js服务器如何服务下一个请求,如果当前请求有巨大的计算?
  • 哪个更好的node.js并发任务? 纤维? networking工作人员? 或线程?
  • 加快setInterval
  • Async.js – 并行真的平行吗?
  • Node.js:asynchronouscallback执行。 这是Zalgo吗?

请参阅这些答案中的链接和插图。 有很多资源来阅读这个话题。

Interesting Posts