Недавно я прочитал о модуле Node worker_threads, который позволяет параллельное выполнение кода Javascript в нескольких потоках, что полезно для операций с интенсивным использованием ЦП. (ПРИМЕЧАНИЕ: это не веб-работники, созданные Chrome в браузере)
Я создаю функцию, в которой мне нужно делать огромное количество Postgres INSERT, не блокируя браузер.
Проблема в следующем: в моих файлах Javascript, где я создаю экземпляр рабочего, мне не разрешено импортировать что-либо, включая собственные модули Node или библиотеки NPM, такие как Knex.js, которые необходимы для выполнения запросов к базе данных. Я получаю сообщение об ошибке: Невозможно использовать оператор импорта вне модуля, как только файл будет выполнен.
Я пробовал поместить рабочий код в другой файл с оператором импорта вверху (та же ошибка). Я пробовал передать объект Knex в workerData, но он не может клонировать неродной объект JS.
У меня нет идей - кто-нибудь знает, как взаимодействовать с базой данных в рабочем потоке, если мы не можем импортировать библиотеки NPM?!?!
// mainThread.js
const { Worker, isMainThread, parentPort, workerData } = require('worker_threads');
import knex from 'knex'; // --> *** UNCAUGHT EXCEPTION: Cannot use import statement outside a module ***
if (isMainThread) {
module.exports = async function runWorker (rowsToInsert = []) {
return new Promise((resolve, reject) => {
const worker = new Worker(__filename, { workerData: { rowsToInsert } });
worker.on('message', (returningRows) => resolve(returningRows));
worker.on('error', reject);
worker.on('exit', (code) => {
if (code !== 0) reject(new Error(`Worker stopped with exit code ${code}`));
});
});
};
} else {
const { rowsToInsert } = workerData;
return knex('table').insert(rowsToInsert)
.then((returningRows) => {
parentPort.postMessage({ data: returningRows });
});
}
Я следую руководству на этой веб-странице: https://blog.logrocket.com/use-cases-for-node-workers/
if (isMainThread) {}
. Кроме того, полное интеллектуальное понимание того, какой код и где выполняется, будет намного проще, если вы разделите их на два файла. - person jfriend00   schedule 16.07.2020