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

win*_*ter 6 multithreading node.js

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

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)
Run Code Online (Sandbox Code Playgroud)

我试图构建一个最小的例子来重现我想要实现的目标。基本上,我需要的是将可读流发送回主线程。在这个例子中,我也有一个例外:

为了有一个工作线程池,我专门使用了库node-worker-threads-pool the DynamicPool。在里面,我正在尝试转换html为 PDF。但我需要以某种方式将流返回到主线程。

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)
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)

你知道我怎样才能做到这一点吗?

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

Dan*_*cci 4

简短版本:你不能。

节点中的 IPC 是通过一些黑匣子处理的,但我们知道消息对象在发送之前被序列化,并在接收后反序列化:您无法序列化 a,Stream因为它基于底层级别(套接字、文件描述符、自定义读取)并编写无法序列化/反序列化的函数等)。

所以你被迫交换可序列化的数据。

看看html-pdf我认为转换程序的一个简单方法是使用pdf.toBuffer:而不是尝试将 a 发送Stream到主线程并在主线程中读取它来获取 a Buffer,您应该将 a 发送Buffer到主线程而不是按原样使用它。

希望这可以帮助。