2

我读过在 node.js 中创建的 HTTP 服务器不会为每个传入连接(请求)创建新线程。相反,它执行一个已注册为对应于接收请求事件的回调的函数。

据说每个连接都由堆中的一些小空间表示。我无法弄清楚这一点。连接不是由套接字表示的吗?是否应该为与 node.js 服务器建立的每个连接都打开套接字,这意味着每个连接不能仅由 javascript 堆中的空间分配来表示?

4

1 回答 1

3

在 nodejs.org 网站上描述,服务器使用 select()、epoll、kqueue 或 /dev/poll 来等待套接字准备好读取/写入,而不是为每个连接生成线程(每个线程 2mb 开销!) . 正是这种方法允许节点避免每个连接产生线程,并且开销与连接的套接字描述符的堆分配相关联。这个实现细节在很大程度上对开发人员隐藏,运行时公开的 net.socket API 提供了利用该功能所需的一切,甚至无需考虑它。

Node 还通过 events.EventEmitter 公开自己的事件 API。许多节点对象实现事件以提供异步(非阻塞)事件通知,这非常适合 I/O 操作,在其他语言(例如 PHP)中默认情况下是同步(阻塞)的。在 node net.socket API 的情况下,会为处理套接字 I/O 的几个 API 方法触发事件,并且在事件发生时触发通过参数传递给这些方法的回调。事件可以通过多种不同的方式绑定回调函数,接受回调函数作为参数只是为了方便开发人员。

最后,不要将 OS 事件与 nodejs 事件混淆。在 net API 的情况下,OS 事件被传递给 nodejs 运行时,但 nodejs 事件是 javascript。

我希望这有帮助。

于 2011-10-02T01:58:42.627 回答