与一位同事进行了一些交谈,它陷入了线程的兔子洞,我想知道像expressjs这样使用https模块内置的nodejs的东西是否使用workers来监听每个网络请求或其他设计的连接。
有人知道http类型请求通常如何等待连接吗?线程?工人?
nodejs http/s 模块是否使用工作线程来监听请求?
不,不是的。 Nodejs 是一个事件驱动的系统。只要有可能,它就会使用操作系统中的底层异步功能,这就是它对所有 TCP/UDP 网络(包括 http)所做的事情。
因此,它使用操作系统中的本机异步功能。当某些网络事件发生时(例如传入连接或传入数据包),操作系统将通知nodejs并将事件插入事件队列。当nodejs没有做其他事情时,它会返回到事件队列并从事件队列中拉出下一个事件并运行与该事件关联的代码。
这一切都是由 libuv 库为 Nodejs 管理的,该库提供了 Nodejs 运行的操作系统兼容层(在多个不同的平台上)。网络是 libuv 提供的一部分。
这并不涉及为每个 TCP 套接字设置一个单独的线程。 libuv 本身使用一些系统线程来完成其工作,但它不会为您连接的每个 TCP 套接字创建一个新线程,并且需要注意的是,它使用操作系统中的本机异步网络接口(而不是阻塞接口)。
libuv 项目是here https://libuv.org/(包括来源)如果您想了解有关该特定库的更多信息。
libuv 确实使用线程池来执行某些在操作系统中没有一致、可靠的异步接口的操作(例如文件系统访问),但该线程池不用于或不需要用于网络。
网络上还有无数关于 NodeJS 事件循环各个方面如何工作的文章,其中包括 NodeJS 文档本身中的一些文章。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)