JavaScript,或者在这种情况下,V8是Node正在使用的引擎,在设计上是单线程的。所以,是的,只有一个事件队列。
但最终,这不是问题,除非您使用多个处理器,否则总会首先发生某些事情,即使这样,您很可能只有一个网卡......一个路由器...你明白了。另外,使用1000多个线程...这不是一个好主意,扩展得很差,你会发现自己处于并发地狱。
1000个聊天用户,这对Node.js来说完全没有问题。
我可以给你一个非常基本的想法,你会如何设置它,这个普通的香草聊天的东西在telnet上工作,它有.没有功能,但它的工作原理:
var net = require('net'); // require the net module
var users = []; // keep track of the users
// setup a new tcp socket server
net.createServer(function(socket) { // provide a callback in case a new connection gets
// established, socket is the socket object
// keep track of this users names, via use of closures
var name = '';
// ask the new user for a name
socket.write('Enter a Name(max 12 chars): ');
// register a callback on the socket for the case of incoming data
socket.on('data', function(buffer) { // buffer is a Buffer object containing the data
if (name !== '') { // in case this user has a name...
// send out his message to all the other users...
for(var i = 0; i < users.length; i++) {
if (users[i] !== socket) { // ...but himself
users[i].write(name + ': '
+ buffer.toString('ascii').trim()
+ '\r\n');
}
}
// otherwise take the data and use that as a name
} else {
name = buffer.toString('ascii').substring(0, 12).trim().replace(/\s/g, '_');
socket.write('> You have joined as ' + name + '\r\n');
// push this socket to the user list
users.push(socket);
for(var i = 0; i < users.length; i++) {
if (users[i] !== socket) {
users[i].write('> ' + name + ' has joined' + '\r\n');
}
}
}
});
// another callback for removing the user aka socket from the list
socket.on('end', function() {
users.splice(users.indexOf(socket), 1);
});
// bind the server to port 8000
}).listen(8000);
这里没有魔法(除了使用闭包),你不必与原始套接字编程有关,也不会有任何并发问题。你还可以了解一些最新的热点;)
我建议您观看我们的Node.js标签wiki上列出的一些讲座,以更好地了解Node.js的工作原理。