是否可以为NodeJS工作线程构造函数使用字符串?

t40tm48m  于 2023-02-21  发布在  Node.js
关注(0)|答案(2)|浏览(131)

在NodeJS文档中,Worker构造函数看起来需要一个文件路径,该文件包含要在新工作线程上执行的代码。
它大概是这样的:

const encode_worker = new Worker(`./service-encode.js`, { workerData: config });

我的问题是是否可以为Worker传递一个字符串而不是一个文件?我问这个问题的原因是由于我们的主应用程序是如何构建的,以及如何从它的主机应用程序启动的。
例如,是否有可能

const encode_worker = new Worker(`console.log("Hello World")`, { workerData: config });

如果是这样,我们如何处理多行字符串呢?

3okqufwl

3okqufwl1#

下面这些对我很有效。

const {
    Worker
} = require('worker_threads');

const workerString = `
const {
    parentPort
} = require('worker_threads');

parentPort.postMessage('hello')
`

const worker = new Worker(workerString, {eval: true});
worker.on('message', msg => {
    console.log(msg)
})
lsmepo6l

lsmepo6l2#

在Niilo回答的基础上,我使用{ eval: true }工作模式的方式如下:

const { Worker } = require('worker_threads');

const workerFn = () => {
    const { parentPort } = require('worker_threads');

    parentPort.postMessage('hello');
};

const worker = new Worker(workerFn.toString().substr(6), { eval: true });

worker.on('message', msg => {
    console.log(msg);
});

我们的想法是使用Function.toString()来获得一个构建得更优雅的辅助代码片段,并像普通的JS一样对辅助代码进行实际验证、翻译和lint。
请注意,上面的workerFn箭头函数中的代码不能从主线程访问任何外部作用域变量,包括必须在工作线程中再次访问require模块。

相关问题