0

我偶然发现了 NodeJS 中的工作线程,并开始研究较低级别的抽象,它们之间的相互通信和数据共享是如何工作的,尤其postMessage是用于在线程之间发送消息数据的函数。

查看这行代码const { Worker, isMainThread, parentPort } = require('worker_threads');,您会猜测它使用套接字来进行通信,因为正在使用关键字端口,但我在通过命令提示符搜索它们时发现没有打开的端口连接。

我想了解worker_thread机制使用什么通信协议?是 TCP 还是其他在线程之间共享数据和消息的机制?这是基于我想自己进行的一项研究,以了解在 worker_threads 之间传输大量数据的效率与使用内存共享/TCP 的子进程之间的 ICP 通信的效率。

4

1 回答 1

0

工人不使用任何类型的 TCP/IP 或其他进程间通信协议与他们的父母进行通信。工人之间以及工人和父母之间传递的消息直接来回传递数据。Worker 和他们的父母共享一个地址空间和 V8 实例。

.postMessage()看起来像这样,哪里transferList是可选的。

port.postMessage(value, transferList)

第一个参数中的项目被克隆,并从发送者传递到消息的接收者的副本。

第二个参数中的项目在不克隆的情况下传递。只有某些数组样式的数据类型可以通过这种方式传输。发送者失去对这些项目的访问权,而接收者获得访问权。这节省了克隆时间,并且可以更快地传递像图像这样的大型数据结构。这种消息传递适用于浏览器和 nodejs 代码。

子进程可以从派生进程到派生进程来回传递数据。该数据通过在生成时设置的进程间通信方法复制和推送。在许多情况下,IPC 机制使用操作系统级别的管道;它们与任何 IPC 机制一样有效,尤其是在 UNIX 派生的操作系统上。子进程不与父进程共享内存,因此它们不能直接使用transferList所有权变更方案。

于 2021-01-06T17:13:16.737 回答