我最近阅读了 Node 的“worker_threads”模块,该模块允许在多个线程中并行执行 Javascript 代码,这对于 CPU 密集型操作很有用。(注意:这些不是 Chrome 在浏览器中制作的网络工作者)
我正在构建一个功能,我需要在不阻塞浏览器的情况下执行大量 Postgres INSERT。
问题是:在我实例化 worker 的 Javascript 文件中,我不允许导入任何内容,包括本地 Node 模块或 NPM 库(如 Knex.js),这是执行数据库查询所必需的。我收到一条错误消息:一旦执行文件,就无法在模块外部使用 import 语句。
我尝试将工作代码放在另一个文件中,并在顶部使用 import 语句(同样的错误)。我尝试将 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/