在node.js' vm'中运行多个并发脚本模

时间:2017-09-20 03:01:35

标签: javascript node.js

关于' vm' node.js中的模块,在多个虚拟机中实例化和运行脚本的最佳方法是什么?我的目标是创建多个vm,并能够同时运行每个脚本。

我还没有找到任何答案的具体问题:

  • 每个' vm'在自己的线程上运行(或作为一个单独的进程)?
  • 是否支持回调机制,以便脚本可以让调用代码知道它已完成等等?
  • 是否支持Promise或async / await?

我相信答案已经存在,但是因为' vm'这是一个过度使用的术语,我很难找到有用的信息。

1 个答案:

答案 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 loopfrom vm 1}}秒。

  

是否支持回调机制,以便脚本可以让调用代码知道它已完成等等?

实际上本地不支持,但您可以设法按照我在沙箱中callback执行的方式编写代码,这是vm与您之间的单一共享状态代码是global变量。