我已经读过在node.js中创建的HTTP服务器不会为每个传入连接(请求)创建新线程。相反,它执行一个已注册为对应于接收请求事件的回调的函数。
据说每个连接都由堆中的一些小空间表示。我无法弄清楚这一点。连接不是由套接字表示的吗?是否应该为每个与node.js服务器建立的连接打开套接字,这是否意味着每个连接都不能仅通过javascript堆中的空间分配来表示?
答案 0 :(得分:3)
在nodejs.org网站上描述的是,不是每个连接产生线程(每个线程2mb开销!),服务器使用select(),epoll,kqueue或/ dev / poll等待套接字准备好读/写。正是这种方法允许节点避免每个连接产生线程,并且开销是与连接的套接字描述符的堆分配相关联的开销。这个实现细节在很大程度上是由开发人员隐藏的,运行时公开的net.socket API提供了利用该功能所需的一切,甚至没有考虑它。
Node还通过events.EventEmitter公开自己的事件API。许多节点对象实现事件以提供异步(非阻塞)事件通知,这对于I / O操作是完美的,在其他语言(例如PHP)中,默认情况下是同步(阻塞)。对于节点net.socket API,会触发几个处理套接字I / O的API方法的事件,并且在事件发生时会触发由参数传递给这些方法的回调。事件可以以各种不同的方式将回调函数绑定到它们,接受回调函数作为参数只是开发人员的便利。
最后,不要将OS事件与nodejs事件混淆。对于net API,OS事件将传递给nodejs运行时,但nodejs事件是javascript。
我希望这会有所帮助。