我偶然发现了NodeJS中的工作线程,并开始研究它们之间的相互通信和数据共享的底层抽象是如何工作的,特别是用于在线程之间发送消息数据的postMessage函数。
查看这行代码,人们可能会猜测它使用套接字进行通信,因为关键字const { Worker, isMainThread, parentPort } = require('worker_threads');正在使用,但通过命令提示符搜索它们时,我没有发现任何开放的端口连接。
我想了解worker_thread机制使用的通信协议是什么?是TCP还是其他在线程之间共享数据和消息的机制?这是基于一项研究,为了理解在worker_threads之间传输大量数据的效率,还是对子进程之间使用内存共享/TCP进行通信的效率,我想提交给我自己。
发布于 2021-01-07 01:13:17
工作人员不会使用任何类型的TCP / IP或其他进程间通信协议与父母进行通信。工人之间以及工人和父母之间传递的消息直接来回传递数据。工作者及其父代共享单个地址空间和V8实例。
.postMessage() looks like this,其中transferList是可选的。
port.postMessage(value, transferList)第一个参数中的项是cloned,以及从消息的发送者传递到接收者的副本。
传递第二个参数中的项时不会克隆它们。只有某些数组样式的数据类型才能以这种方式传输。发送者失去对这些项目的访问权,而接收者获得访问权。这节省了克隆时间,并使其更快地传递大型数据结构,如图像。这种消息传递在浏览器和nodejs代码中都有效。
子进程可以将数据从派生进程来回传递到派生进程。该数据通过在产生时设置的进程间通信方法进行复制和推送。在许多情况下,IPC机制使用OS级管道;这些管道与任何IPC机制一样有效,尤其是在UNIX派生的OS上。子进程不与父进程共享内存,因此它们不能直接使用transferList所有权变更方案。
https://stackoverflow.com/questions/65587840
复制相似问题