Node.js nodejs-将流从工作线程发送回主线程

Node.js nodejs-将流从工作线程发送回主线程,node.js,multithreading,Node.js,Multithreading,我一直在尝试将程序中完成的一些工作分离到另一个线程中。 其中一个函数需要将流返回到主线程,但我遇到以下异常: Error at MessagePort.<anonymous> ([worker eval]:12:16) at processTicksAndRejections (internal/process/task_queues.js:97:5) From previous event: at PoolWorker.work (node_modules/

我一直在尝试将程序中完成的一些工作分离到另一个线程中。 其中一个函数需要将流返回到主线程,但我遇到以下异常:

Error
    at MessagePort.<anonymous> ([worker eval]:12:16)
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
From previous event:
    at PoolWorker.work (node_modules/node-worker-threads-pool/src/pool-worker.js:22:12)
    at DynamicPool.runTask (node_modules/node-worker-threads-pool/src/pool.js:110:47)
    at DynamicPool.exec (node_modules/node-worker-threads-pool/src/dynamic-pool.js:51:17)
    at renderToPdf (src/modules/templates/render2.js:27:14)
    at Context.<anonymous> (test/modules/templates/render.test.js:185:68)
errdatacloneerror:function(){
如果(此自动关闭){
这个。销毁();
}
}无法克隆。
在MessagePort。([工人评估]:12:16)
在处理和拒绝时(内部/process/task_queues.js:97:5)
你知道我怎样才能做到这一点吗


PS:我知道IO操作在工作线程中的性能不如在nodejs主线程中,但我需要这样做,以避免用这些操作锁定主线程。

简短版本:您不能

节点中的IPC是通过一些黑盒处理的,但我们知道的是,消息对象在发送之前是序列化的,在接收之后是反序列化的:您不能序列化
,因为它基于无法序列化/反序列化的下划线级别(套接字、文件描述符、自定义读写函数等)

因此,您必须交换可序列化的数据

看一看
HTMLPDF
我认为转换程序的一个简单方法是使用
pdf.toBuffer
:与其尝试将
发送到主线程并在主线程中读取以获得
缓冲区
,不如将
缓冲区
发送到主线程并按原样使用


希望这有帮助。

与其尝试将
提供给主线程,为什么不直接通过管道传输呢

在他们之间创建一个共享的
MessageChannel

父级实现了
可读的
,将其
消息端口
包装为在('message')上侦听

线程有一个接口,它实现了
可写
,基本上是将
write()
中的任何数据直接传递到
.postMessage()

别忘了为其返回值在
write()
周围添加更多的实现。我总是在子线程的
可写
中返回false,并使用
postMessage()
将主线程的
可读
中的所有
'drain'
事件转发回子线程(当主线程的管道可写从可读线程返回true时,强制/fudge one)

现在您有了一种流式处理主线程的方法。
对于要从子线程发送的原始
,只需
.pipe()
在主线程中,只需从您的
Readable
中读取,或者将其导入管道,就好像您真正拥有它一样

err DataCloneError: function() {
    if (this.autoClose) {
      this.destroy();
    }
  } could not be cloned.
    at MessagePort.<anonymous> ([worker eval]:12:16)
    at processTicksAndRejections (internal/process/task_queues.js:97:5)