内容目录
一、前提
我以前只认为node js 只能单线程,我自己用了一段时间electron 桌面开发,如果遇到CPU密集型业务怎么做呢?我不可能只靠一个CPU来搞业务啊,这个限制不是太大了?
二、解决方法
1:多进程
child_process
等模块创建多进程
这种打补丁方法不是很好,涉及进程通信,写代码效率不高,很容易出现bug。开发者很可能出现变量无法访问的问题,因为多个进程,变量没有共享。不过业务写很分开,也问题不大,多进程资源比较大。
2:多线程
worker_threads
真正用的是多线程,我自己写代码测试,不停创建worker_threads..
测试代码
const { Worker, isMainThread, parentPort } = require('worker_threads');
console.log("hello world:" + isMainThread)
/*if (isMainThread) {
// This code is executed in the main thread and not in the worker.
// Create the worker.
const worker = new Worker(__filename);
// Listen for messages from the worker and print them.
worker.on('message', (msg) => {
console.log(msg);
});
} else {
// This code is executed in the worker and not in the main thread.
// Send a message to the main thread.
parentPort.postMessage('Hello world!');
}*/
function test(){
if(isMainThread){
console.log("自动线程哦");
const worker = new Worker("./work.js");
}
}
setInterval(() => {
test();
}, 1000);
通过定时器不停创建工程线程。
work.js
const { isMainThread, parentPort,Worker, threadId } = require('worker_threads');
const min = 2
const max = 1e7
function generatePrimes(start, range) {
let primes = []
let isPrime = true
let end = start + range
for (let i = start; i < end; i++) {
for (let j = min; j < Math.sqrt(end); j++) {
if (i !== j && i%j === 0) {
isPrime = false
break
}
}
if (isPrime) {
primes.push(i)
}
isPrime = true
}
return primes
}
console.log("线程id:" + threadId)
generatePrimes(1, 10000000)
console.log("线程id:" + threadId + " 完成")
可以通过资源管理器查看线程【默认不显示,自己设置一下】,线程数不停增加
可以不停增加,因为我这个写法,会很快把cpu吃死。。。。如果像以前nodejs 普通写法,最多只能吃一个CPU..
注意在线程里面不要直接访问对象,毕竟node js 模式就是异步+主线程,引入多线程导致更多问题,多线程仅仅执行,然后丢回主线程即可。