5.1 worker_thread通信

1、简单示例

run.js

const {
    Worker
} = require('worker_threads');
const worker1 = new Worker('./worker1.js');
const worker2 = new Worker('./worker2.js');
worker1.postMessage('here is father')
worker1.on('message',function (msg){
    console.log(msg)
})
worker2.postMessage('here is father')
worker2.on('message',function (msg){
    console.log(msg)
})

worker1.js

const {
    parentPort
} = require('worker_threads');

parentPort.on('message',function (msg){
    console.log(msg)
})
parentPort.postMessage('i am worker1')

worker2.js

const {
    parentPort
} = require('worker_threads');
parentPort.on('message',function (msg){
    console.log(msg)
})
parentPort.postMessage('i am worker2')

上述是主线程和子线程的一个简单的通信示例

2、工作线程间通信

run.js

/**
 * 两个子worker之间通信
 *
 * */
const {
    MessageChannel, Worker
} = require('worker_threads');
const subChannel = new MessageChannel();
const worker1 = new Worker('./worker1.js');
const worker2 = new Worker('./worker2.js');

worker1.postMessage({ hereIsYourPort: subChannel.port1 }, [subChannel.port1]);
worker2.postMessage({ hereIsYourPort2: subChannel.port2 }, [subChannel.port2]);

worker1.js

const {
    parentPort
} = require('worker_threads');

parentPort.on('message',function (msg){
    msg.hereIsYourPort.postMessage('i am worker1')
    msg.hereIsYourPort.on('message',function (msg){
        console.log(msg)
    })
})

worker2.js

const {
    parentPort
} = require('worker_threads');

parentPort.on('message',function (msg){
    msg.hereIsYourPort2.on('message',function (msg){
        console.log(msg)
    })
    msg.hereIsYourPort2.postMessage('i am worker2')
})

worker.postMessage(value,transferList)

transferList参数,我理解是转移,将允许的对象转移到某个的worker中,一旦转移了,则其他worker就不能再使用该对象了,如果不传transferList,则代表的是值的拷 

transferList可转移的对象,如下

type TransferListItem = ArrayBuffer | MessagePort | FileHandle | X509Certificate | Blob;

array对象只能在worker1中使用,worker2中再使用的话,便会报错

示例

const { Worker } = require('worker_threads')
const array = new ArrayBuffer(1)
const worker1 = new Worker('./worker1.js')
const worker2 = new Worker('./worker2.js')
worker1.postMessage(array,[array])
worker2.postMessage(array)

通过markAsUntransferable()方法,可以标注不允许转移的对象

上述示例修改一下

const { Worker,markAsUntransferable } = require('worker_threads')
const array = new ArrayBuffer(1)
const worker1 = new Worker('./worker1.js')
const worker2 = new Worker('./worker2.js')
markAsUntransferable(array)
worker1.postMessage(array,[array])
worker2.postMessage(array)

当array被标注不可转移后,即便postMessage()方法传了,也是无效的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值