我刚接触nodeJS,对node的单实例模型感到好奇。在一个简单的nodeJs应用程序中,当一些阻塞操作使用回调函数异步处理时,主线程是否也会处理回调函数呢? 如果请求是从数据库获取数据,并且有100个并发用户,每个数据库操作需要几秒钟,当最终触发回调函数时(对于每个连接),主线程是否也用于执行回调函数? 如果是这样,nodeJs如何扩展并如何快速响应?
我刚接触nodeJS,对node的单实例模型感到好奇。在一个简单的nodeJs应用程序中,当一些阻塞操作使用回调函数异步处理时,主线程是否也会处理回调函数呢? 如果请求是从数据库获取数据,并且有100个并发用户,每个数据库操作需要几秒钟,当最终触发回调函数时(对于每个连接),主线程是否也用于执行回调函数? 如果是这样,nodeJs如何扩展并如何快速响应?
每个Node.js实例都在单个线程中运行,没有例外。当您进行异步调用(例如网络请求)时,它不会在您的代码或任何其他地方等待响应。它有一个事件循环负责这些操作。当响应准备好时,它将调用您的回调函数。
这种方式能够得到非常高效的性能,因为它不需要大量线程和所有内存开销,但这意味着您需要小心不要做同步阻塞的操作。
关于事件循环的解释可以在http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/找到,Ryan Dahl在 jsconf 上的演示也值得观看,链接为http://www.youtube.com/watch?v=ztspvPYybIY。您见过工程师因技术演示而获得起立鼓掌吗?