调用iterator(object|arr,tr:线程数量) 返回loop(callback,callback)
arr.length=100000 开启5个线程对arr做并发计算 iterator(arr,5).loop( function(){ //这个函数会开启子线程并做计算 return val //将结果发送给第二个回调函数 }, function(val){ //这个函数接收子线程计算结果 } )
const { isMainThread, Worker, // MessagePort, parentPort, // MessageChannel, // workerData // 在主线程为null,工作线程中为主线程传递的值 } = require('worker_threads');
const call=()=>{ return 1 }
//tr=线程数量 function iterator (arr,tr=3) {
const destructor = (arr) => { let newArr = [] const flat = (arr)=>{ Object.keys(arr).forEach(key => { let val = arr[key] if (typeof val === 'object') { flat(val) } else { if(val){ newArr.push(val) }
}
})
}
flat(arr)
return newArr
}
const sliceTask = (newArr)=>{
//根据线程切片
const total = newArr.length
const slices = total / tr
const task=[]
let start=0
for (let block = 0; block < tr;block++) {
task.push(newArr.slice(start, start+slices))
start = start + slices
}
return task
} const newArr=destructor(arr) //解构数据 const tasks = sliceTask(newArr) // debugger return { loop (callback,send) {
tasks.forEach(task=>{
if (isMainThread) {
const worker = new Worker(__filename);
//let value = val
worker.once('message', (val) => {
send(val)
worker.terminate()
});
worker.postMessage({task,callback:callback.toString()})
} else {
parentPort.once('message', ({task,callback}) => {
//这里是子线程,也可以在这里写
const arr=[]
task.forEach(val => {
// eval(`${callback};callback('received:' + ${val})`)
const res= eval('(' + callback+ ')'+ '(val)')
// const res=call()
arr.push(res)
//callback('received:' + val)
})
parentPort.postMessage(arr);
});
}
})
}
}
}
console.time('a') const arr=[1, 2, [3, [4, [5, 6, [{ key: 'haah', ri: 'hehe' }, 8]]]], 9, [10, [11, [12, [13]]]],].concat( Array.from({length:1000},(item)=>23) ) //*传递一个object或者arr,第二个是线程数量 //然后回调loop的 iterator(arr,3) // loop 说明 第一回调函数必须不能是箭头函数,第二个回调用来接收线程计算的结果 .loop( function (value) {
// console.log(value) // 这里写压缩图片的代码 相当于给这个函数开启了多线程 // 然后返回计算结果, return value },(val)=>{ // 这个函数就是计算上面那个函数的结果是一个数组 console.log(val) })
console.timeEnd('a')
// const arr=[0]
// for(let key=0;key< arr.length;key++){ // arr.push(1) // } // console.log(arr)