Я пытался разделить некоторую работу, проделанную в моей программе, в другой поток. Одна из функций должна возвращать поток в основной поток, но у меня есть следующее исключение:
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)
Я попытался создать минимальный пример для воспроизведения того, чего я пытаюсь достичь. По сути, мне нужно отправить обратно читаемый поток в основной поток. В этом примере у меня также есть исключение:
Чтобы иметь пул рабочих потоков, я использую библиотеку node-worker-thread-pool специально DynamicPool. А внутри пытаюсь преобразовать html
в PDF. Но мне нужно как-то вернуть поток в основной поток.
const os = require('os');
const { DynamicPool } = require('node-worker-threads-pool');
const Pool = new DynamicPool(os.cpus().length);
async function convertToPDF(html) {
return await Pool.exec({
task: function() {
const Promise = require('bluebird');
const pdf = require('html-pdf');
const { html } = this.workerData;
const htmlToPdf = (html, renderOptions) => {
const options = {
format: 'Letter',
};
return pdf.create(html, Object.assign(options, renderOptions || {}));
};
return Promise.fromNode((cb) => htmlToPdf(html, {}).toStream(cb));
},
workerData: {
html,
},
});
}
convertToPDF('<div>Hello World!</div>')
.then((resp) => console.log('resp', resp))
.catch((err) => console.error('err', err));
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)
У вас есть идея, как я могу этого добиться?
PS: Я знаю, что операции ввода-вывода не столь производительны в рабочих потоках, поскольку они находятся в основном потоке nodejs, но мне нужно сделать это, чтобы избежать блокировки основного потока этими операциями.