卜娃娃|nodejs 的融会贯通,你学会了吗?( 五 )

  • 无论 child_process 还是 cluster , 都不是多线程模型 , 而是多进程模型
  • 应对单线程问题 , 通常使用多进程的方式来模拟多线程
  • 真 Node 多线程Node 10.5.0 的发布 , 给出了一个实验性质的模块 worker_threads 给 Node 提供真正的多线程能力
    worker_thread 模块中有 4 个对象和 2 个类
    • isMainThread: 是否是主线程 , 源码中是通过 threadId === 0 进行判断的 。
    • MessagePort: 用于线程之间的通信 , 继承自 EventEmitter 。
    • MessageChannel: 用于创建异步、双向通信的通道实例 。
    • threadId: 线程 ID 。
    • Worker: 用于在主线程中创建子线程 。 第一个参数为 filename , 表示子线程执行的入口 。
    • parentPort: 在 worker 线程里是表示父进程的 MessagePort 类型的对象 , 在主线程里为 null
    • workerData: 用于在主进程中向子进程传递数据(data 副本) isMainThread, parentPort, workerData, threadId, MessageChannel, MessagePort, Worker } = require('worker_threads'); function mainThread() { for (let i = 0; i < 5; i++) { const worker = new Worker(__filename, { workerData: i }); worker.on('exit', code => { console.log(main: worker stopped with exit code ${code}); }); worker.on('message', msg => { console.log(main: receive ${msg}); worker.postMessage(msg + 1); }); } } function workerThread() { console.log(worker: workerDate ${workerData}); parentPort.on('message', msg => { console.log(worker: receive ${msg}); }), parentPort.postMessage(workerData); } if (isMainThread) { mainThread(); } else { workerThread(); }
    线程通信const assert = require('assert');const {Worker,MessageChannel,MessagePort,isMainThread,parentPort} = require('worker_threads');if (isMainThread) {const worker = new Worker(__filename);const subChannel = new MessageChannel();worker.postMessage({hereIsYourPort: subChannel.port1}, [subChannel.port1]);subChannel.port2.on('message', (value) => {console.log('received:', value);});} else {parentPort.once('message', (value) => {assert(value.hereIsYourPort instanceof MessagePort);value.hereIsYourPort.postMessage('the worker is sending this');value.hereIsYourPort.close();});}复制代码多进程 vs 多线程进程是资源分配的最小单位 , 线程是CPU调度的最小单位
    最后 , 咱给小编:
    1. 点赞+关注
    2. 点头像关注后多多评论 , 转发给有需要的朋友 。
    【卜娃娃|nodejs 的融会贯通,你学会了吗?】谢谢!!


    推荐阅读