При использовании vm2 в worker_threads можно ли совместно использовать экземпляр NodeVM между работниками?
Я использую worker_threads
а также vm2
реализовать вещь, похожую на серверную, но я не могу получить экземпляр NodeVM в главном потоке, а затем пройти через workData(из-за worker_threads
ограничение), поэтому я могу только new NodeVM
в рабочем потоке на запрос, внутри которого я не могу повторно использовать экземпляр vm, и стоимость вредит.
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,
});
Кто-нибудь может дать мне совет?
Большое спасибо.
1 ответ
Я решил запретить external
модуль импорта. Так как require
внутренне readFileSync, который стоит большую часть времени, и http
модуль внутри самого узла может быть использован для замены request-promise
,
После комментария external
опция, средняя стоимость времени инициализации составляет примерно 10+ мс, что является приемлемым на данный момент.
Но если worker_threads
может клонировать объект функции через workerData, это было бы более эффективным.