Node.js 多线程完全指南总结

2020-06-17 06:09:52易采站长站整理
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
非常相似,但缺少后者的几个重要功能。