封装的一个node多线程处理函数,开箱可用,

358 阅读1分钟

调用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)