2017-07-20 36 views

回答

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
  • 用户指定的代码()

参见那些答案的更多细节:

见这些答案的链接和说明。有很多资源可以阅读这个话题。

+0

这些都是很好的参考,但没有一个具体讨论这个问题。让我问一个更具体的问题。由于所有网络io都在libuv中的单个线程上运行,为了实现具有某些事件读取事件的异步io,您必须为该操作系统委派任务,并为其提供一个用户定义的缓冲区,该缓冲区将填充来自阅读op,但那将是proactor模式。 libuv如何通过使用单线程反应器事件循环实现类似的效果? – Michael

+0

@Michael大多数网络I/O在单个天线上运行,但例如而不是DNS操作(getaddrinfo和getnameinfo)而不是文件系统I/O,所以这不像看起来那么清晰,并且没有任何单一的理论模式可以100%应用于Node需要的所有边缘情况支持所有平台。 – rsp

+0

@Michael我在答案中列出的第一个答案有一些评论,你可能会发现[** saghul **]发布的有用评论(https://stackoverflow.com/users/280310/saghul?tab=topactivity )(我想这个人会给你一个更详细的答案给你的评论,但不幸的是,只能在注释中注明某人回答他已经评论过的地方)。 – rsp