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()方法传了,也是无效的。