好的,为了给出一些透视图,让我将node.js与Apache进行比较。
Apache是一个多线程HTTP服务器,对于服务器接收的每个请求,它都会创建一个单独的线程来处理该请求。
另一方面,Node.js是事件驱动的,从单个线程异步处理所有请求。
当在Apache上接收到A和B时,将创建两个处理请求的线程。每个单独处理查询,每个在服务页面之前等待查询结果。只有在查询完成之前才能使用该页面。由于服务器在收到结果之前无法执行其余的线程,所以查询FETCH处于阻塞状态。
在节点中,C.Query是异步处理的,这意味着当c.query为A获取结果时,它跳到处理B的c.query,当结果到达A时,将结果发送回调,后者发送响应。js知道在提取完成时执行回调。
在我看来,因为它是一个单线程模型,所以无法从一个请求切换到另一个请求。
实际上,节点服务器一直都是这样做的。要使开关(异步行为),您要使用的大多数函数都会有回调。
编辑
SQL查询从MySQL图书馆。它实现回调样式以及事件发射器来排队SQL请求。它不异步执行它们,这是由内部利布夫提供非阻塞I/O抽象的线程:
- 打开到db的连接,就可以异步地建立连接本身。
- 连接db后,查询将传递给服务器。查询可以排队。
- 主事件循环通过回调或事件得到完成通知。
- 主循环执行回调/均衡器。
对http服务器的传入请求以类似的方式处理。内部线程体系结构如下所示:
C+线程是执行异步I/O(磁盘或网络)的libuv线程。主事件循环在将请求分派到线程池后继续执行。它可以接受更多的请求,因为它不等待或睡眠。SQL查询/HTTP请求/文件系统读取都是这样发生的。