对node(V8)是"单线程模型"(可以多进程),非阻塞(异步)的理解

1
Node.js uses an event-driven, non-blocking I/O model

“单线程模型”

“单线程模型” 是 event loop模型(类似Nginx), 既然主线程就一个事件循环(长期run), 就没有线程同步问题(例如计数器就直接累加就可以)
之前用java的Spring是每一个请求都创建一个线程(多线程),虽然更安全(不怕子线程崩溃),但对cpu和内存消耗比较大(独占一份资源).但多线程竞争要自己控制(同步锁,单例什么的)

非阻塞

非阻塞 是 主线程把高耗时的工作(例如IO)交给操作系统或其他进程处理, 等处理完了再回到event loop里(等xxx再yyy是异步), 继续循环
相对java某进程没处理完就卡在那等着(同步), 会比较节省资源

可以多进程

cluster是多进程api(包括管理进程,进程通信等),因为有了cluster让nodeJS的多进程编程比较容易
看例子, node可以多进程没什么异议

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
var cluster = require('cluster');
var http = require('http');
var CPUNums = require('os').cpus().length; //CPU的个数
if (cluster.isMaster) {
for (var i = 0; i < CPUNums; i++) {
var worker = cluster.fork();
worker.on('message', function (message) {
console.log(message.from + ': ' + message.type + ' ' + message.data.result);
});
}
console.log("fork()_" + i + "_times");
// cluster.on('exit', function (worker, code, signal) {
// console.log('worker ' + worker.process.pid + ' died');
// });
for (var wid in cluster.workers) {
cluster.workers[wid].send({
type: 'msgSend1',
from: 'master',
data: {
number: Math.floor(Math.random() * 50)
}
});
}
} else {
//应用逻辑
// http.createServer(function (req, res) {
// res.writeHead(200);
// res.end("hello world\n");
// }).listen(8000);
process.on('message', function (message) {
if (message.type === 'msgSend1') {
process.send({
type: 'msgSend2',
from: 'Worker ' + process.pid,
data: {
number: message.data.number,
result: "msg==>" + message.data.number
}
});
}
});
}
1
2
3
4
5
6
7
>node cluster.js
fork()_4_times
Worker 24568: msgSend2 msg==>41
Worker 24572: msgSend2 msg==>3
Worker 23568: msgSend2 msg==>45
Worker 18812: msgSend2 msg==>35