gpt4 book ai didi

node.js - 当在worker_threads中使用vm2时,是否可以在worker之间共享NodeVM实例?

转载 作者:太空宇宙 更新时间:2023-11-04 01:36:57 25 4
gpt4 key购买 nike

我正在使用 worker_threadsvm2 来实现类似无服务器的东西,但是我无法在主线程中获取 NodeVM 实例,然后传递 workData(因为worker_threads 的限制),因此我只能在每个请求的工作线程中new NodeVM,在其中我无法重用虚拟机实例,并且成本会受到影响。

new NodeVM() 需要 200 ~ 450 毫秒才能完成,所以我希望预先初始化一个可重用的实例。

const w = new Worker(`
(async () => {
const { workerData, parentPort } = require('worker_threads');
const { NodeVM } = require('vm2');
const t = Date.now();
const vm = new NodeVM({ // cost 200 ~ 450 ms
console: 'inherit',
require: {
external: [ 'request-promise', 'lodash' ],
builtin: [],
import: [ 'request-promise', 'lodash' ], // faster if added
},
});
console.log('time cost on new NodeVM:', Date.now() - t);
const fnn = vm.run(workerData.code, workerData.filename);
console.log('time cost by initializing vm:', Date.now() - t);
try {
const ret = await fnn(workerData.params);

parentPort.postMessage({
data: typeof ret === 'string' ? ret : JSON.stringify(ret),
});
} catch (e) {
parentPort.postMessage({
err: e.toString(),
});
}
console.log('----worker donex');
})();
`,
{
workerData: {
params,
code,
dirname: __dirname,
filename: `${__dirname}/faasVirtual/${fn}.js`,
},
eval: true,
});

有人可以给我一些建议吗?

非常感谢。

最佳答案

我决定禁止外部模块导入。因为require内部是readFileSync,这会消耗大部分时间,而node本身内部的http模块可以用来替代request-promise

注释掉external选项后,init的平均耗时大约为10+ms,目前还可以接受。

但是如果worker_threads可以通过workerData克隆函数对象,效率会更高。

关于node.js - 当在worker_threads中使用vm2时,是否可以在worker之间共享NodeVM实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54229230/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com