worker.terminate() 终止,则代码为1。
worker.on('online', () => {});只要 worker 停止解析 JavaScript 代码并开始执行,就会发出
online 事件。它不常用,但在特定情况下可以提供信息。
worker.on('message', (data) => {});只要 worker 将数据发送到父线程,就会发出
message 事件。现在让我们来看看如何在线程之间共享数据。
在线程之间交换数据
要将数据发送到另一个线程,可以用
port.postMessage() 方法。它的原型如下:
port.postMessage(data[, transferList])port 对象可以是
parentPort,也可以是
MessagePort 的实例 —— 稍后会详细讲解。数据参数
第一个参数 —— 这里被称为
data —— 是一个被复制到另一个线程的对象。它可以是复制算法所支持的任何内容。数据由结构化克隆算法进行复制。引用自 Mozilla:
它通过递归输入对象来进行克隆,同时保持之前访问过的引用的映射,以避免无限遍历循环。
该算法不复制函数、错误、属性描述符或原型链。还需要注意的是,以这种方式复制对象与使用 JSON 不同,因为它可以包含循环引用和类型化数组,而 JSON 不能。
由于能够复制类型化数组,该算法可以在线程之间共享内存。
在线程之间共享内存
人们可能会说像
cluster 或
child_process 这样的模块在很久以前就开始使用线程了。这话对,也不对。
cluster 模块可以创建多个节点实例,其中一个主进程在它们之间对请求进行路由。集群能够有效地增加服务器的吞吐量;但是我们不能用
cluster 模块生成一个单独的线程。人们倾向于用 PM2 这样的工具来集中管理他们的程序,而不是在自己的代码中手动执行,如果你有兴趣,可以研究一下如何使用
cluster 模块。
child_process 模块可以生成任何可执行文件,无论它是否是用 JavaScript 写的。它和
worker_threads 非常相似,但缺少后者的几个重要功能。









