当节点为单线程时,为什么在node.js中需要连接池?

Avn*_*eet 5 pooling redis node.js

Node.js是单线程的。Javascript V8引擎和一些内部库是多线程的。对于I / O,节点将I / O委托给可能是多线程的OS。

如果我的node.js应用程序正在连接到redis或sql / mariadb服务器,我认为我不需要Redis或mysql的连接池。

作为开发人员,我创建了1个redis或mysql连接,并重用它来发送/获取数据。当数据到达时,节点将调用回调以处理数据。

我了解Java / .NET的连接池,但是它们是多线程的,因此Java / .NET中的连接池具有明显的优势。

我的问题是:当节点为单线程时,为什么在node.js中需要连接池?有什么好处吗?如果开发人员不必这样做,节点是否不会利用基础操作系统和JavaScript引擎的多线程功能?

谢谢

pet*_*teb 4

Node单线程运行您的代码。然而,Node.js 实际上有一个可供您使用的线程池,您的代码无法访问该线程池。线程机制是用libuv实现的。看看libuv 的书,它深入地解释了 libuv 的内部工作原理。

基本上,您的代码在事件循环(单线程)的上下文中运行。然后,所有异步工作都会从池中卸载到可用线程,并且事件循环将进行轮询,直到其中一个线程完成该异步工作。I/O Callback Phase完成后,由异步调用注册的回调函数将被调用,并将在下一个事件循环期间开始工作。您可以在 Node.js文档中阅读有关事件循环及其阶段的更多信息。

使用这种事件循环样式构建应用程序的好处之一是对通常与多线程应用程序相关的关键部分编码(互斥体、信号量等)进行抽象。