关于' vm' node.js中的模块,在多个虚拟机中实例化和运行脚本的最佳方法是什么?我的目标是创建多个vm,并能够同时运行每个脚本。
我还没有找到任何答案的具体问题:
我相信答案已经存在,但是因为' vm'这是一个过度使用的术语,我很难找到有用的信息。
答案 0 :(得分:1)
对于您的用例,似乎最好使用来自node.js的
child_process.fork()
模块在vm中运行脚本不被认为是一种好的做法,并且很难确保安全性。child_process 已经实现了回调机制,因此您可以在完成时轻松分配处理程序。
为了回答您的问题,我制作了一个小脚本:
const vm = require('vm');
const sandbox = {
cb: (err, data) => {
if (err) console.log(err);
console.log(data);
},
};
const code = `
function test() {
cb(null, 'from vm');
}
test();
`;
process.nextTick(() => {
console.log('from event loop');
});
vm.runInNewContext(code, sandbox);
脚本的结果是:
from vm
from event loop
这给了我以下结论:
每个'vm'是否都在自己的线程上运行(或作为一个单独的进程)?
不, vm同步运行。如果它以异步方式运行,则下一个tick会在libuv队列前面推送console.log()
,这样我们首先得到from event loop
并from vm
1}}秒。
是否支持回调机制,以便脚本可以让调用代码知道它已完成等等?
实际上本地不支持,但您可以设法按照我在沙箱中callback
执行的方式编写代码,这是vm
与您之间的单一共享状态代码是global
变量。