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

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

一些具体问题我一直没有find答案:

  • 每个“虚拟”运行在自己的线程(或作为一个单独的进程)?
  • 是否支持callback机制,以便脚本可以让调用代码知道它已经完成了等等?
  • 承诺或asynchronous/等待支持?

我相信答案已经在那里了,但是因为“虚拟现实”是一个过度使用的术语,所以我很难find很多有用的信息。

对于你的用例来说,使用node.js中的child_process.fork()模块似乎更好,在vm中运行脚本并不是一个好的做法,而且很难保证安全。

child_process已经实现了callback机制,所以你可以很容易地分配完成处理程序。

为了回答你的问题,我做了一个小脚本:

 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同步运行。 如果它是asynchronous运行的,那么进程下一个tick会把console.log()放在libuv队列的前面,所以我们from event loop获取from event loop然后再from vm获得from event loop

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

实际上,它本身并不支持,但是你可以用我在沙箱中callback的方式来编写代码,而且vm和你的代码之间的单一共享状态是globalvariables。