当前位置: 首页 > 后端技术 > Node.js

Nodejs学习记录:worker_threads(工作线程)

时间:2023-04-04 00:05:29 Node.js

Node.js,由于JS是单线程执行的,CPU密集型计算任务可能会使主线程忙碌,进而影响服务的性能,虽然可以可以通过child_process模块创建子进程来解决,但是一方面进程之间不能共享内存,另一方面创建进程的开销也不小。因此,在10.5.0版本中,Node.js提供了worker_threads模块来支持多线程。长期以来对其不擅长CPU密集型计算的批评有望成为历史。源码-->https://github.com/nodejs/nod...worker_thread模块中有4个对象和2个类。isMainThread:是否为主线程,源码中通过threadId===0判断。MessagePort:用于线程间通信,继承自EventEmitter。MessageChannel:用于创建异步双向通信的通道实例。threadId:线程ID。Worker:用于在主线程中创建子线程。第一个参数是filename,表示子线程执行的入口点。parentPort:在工作线程中,是代表父进程的MessagePort类型的对象,在主线程中为nullworkerData:用于在主进程中向子进程传递数据(数据拷贝)断言');const{Worker,MessageChannel,MessagePort,isMainThread,parentPort}=require('worker_threads');if(isMainThread){constworker=newWorker(__filename);constsubChannel=newMessageChannel();worker.postMessage({hereIsYourPort:subChannel.port1},[subChannel.port1]);subChannel.port2.on('message',(value)=>{console.log('received:',value);});}else{parentPort.once('message',(value)=>{assert(value.hereIsYourPortinstanceofMessagePort);value.hereIsYourPort.postMessage('工人正在发送这个');value.hereIsYourPort.close();});}