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)