每个开放的HTTP连接,Node JS限制为一个线程?

节点JS可以有多个线程在单个HTTP端口上为HTTP客户端提供服务? 这是为了处理一些线程正在等待数据库或进行大量处理的情况。 这不应该干扰像加载图像这样的快速事情的其他线程。

节点不等待数据库,这是重点。 节点是非阻塞的,事件驱动的。 它build立一个callback,并继续前进,准备下一个请求。 它不只是坐在那里,等待数据库回来的请求信息。

Node.js使用一个事件循环 ,所有阻塞的东西都使用了threadpool => libeio (请参见幻灯片63)。 但是,你不应该担心这一点。 你应该只是提供callbackasynchronous操作。 它在操作完成时被调用。

以node_redis这个片段为例 :

var redis = require("redis"), client1 = redis.createClient(), client2 = redis.createClient(), msg_count = 0; client1.on("subscribe", function (channel, count) { client2.publish("a nice channel", "I am sending a message."); client2.publish("a nice channel", "I am sending a second message."); client2.publish("a nice channel", "I am sending my last message."); }); client1.on("message", function (channel, message) { console.log("client1 channel " + channel + ": " + message); msg_count += 1; if (msg_count === 3) { client1.unsubscribe(); client1.end(); client2.end(); } }); client1.incr("did a thing"); client1.subscribe("a nice channel"); 

function(channel, message)例如是事件发生时被调用的这些callback中的一个。

 function (channel, message) { console.log("client1 channel " + channel + ": " + message); msg_count += 1; if (msg_count === 3) { client1.unsubscribe(); client1.end(); client2.end(); } } 

如果您希望多个工作人员在同一端口上进行侦听(如果您有多个核心,则最有用),请查看新的群集API 。 来自文档的示例:

 var cluster = require('cluster'); var http = require('http'); var numCPUs = require('os').cpus().length; if (cluster.isMaster) { // Fork workers. for (var i = 0; i < numCPUs; i++) { cluster.fork(); } cluster.on('exit', function(worker, code, signal) { console.log('worker ' + worker.process.pid + ' died'); }); } else { // Workers can share any TCP connection // In this case its a HTTP server http.createServer(function(req, res) { res.writeHead(200); res.end("hello world\n"); }).listen(8000); }